如何触发批量落库
关于批量落库触发逻辑,目前共分为两种:
写请求满足特定次数后就落库一次,比如10个请求落库一次。
按照次数批量落库的优点是访问数据库的次数变为 1/N,从数据库压力上来说会小很多。
不过它也存在不足:如果访问数据库的次数未凑齐 N 次,用户的预约就一直无法落库。
每隔一个时间窗口落库一次,比如每隔一秒落库一次。
按照时间窗口落库的优点是能保证用户等待的时间不会太久
其缺点是如果某个瞬间流量太大,在那个时间窗口落库的数据就会很多,多到在一次数据库访问中无法完成所有数据的插入操作(比如一秒内堆积了5000条数据),它们只能通过分批次来实现插入
项目采用的方案是同时使用这两种方式。具体实现逻辑如下:
每收集一次写请求,就插入预约数据到缓存中,再判断缓存中预约的总数是否达到一定数量,达到后直接触发批量落库。
开一个定时器,每隔一秒触发一次批量落库。
通过以上操作,既避免了触发方案 1 数量不足、无法落库的情况,也避免了方案 2 因为瞬时流量大而使待插入数据堆积太多的情况。