基于Kafka的静态数据到期/逾期用户通知方案问询
解决方案:基于Kafka实现静态数据的截止时间通知推送
针对你遇到的静态数据无事件触发、多进程扫描冲突的问题,给你几个实用的替代方案:
1. 数据库定时任务+分布式锁
- 用数据库自带的定时任务(比如MySQL EVENT、PostgreSQL pg_cron)定期扫描表A,筛选出临近截止或已逾期的记录。
- 为避免多进程冲突,扫描时加分布式锁:比如用Redis的
SETNX命令,或者数据库行级锁,确保同一时间只有一个进程在执行扫描逻辑。 - 扫到符合条件的记录后,直接发消息到Kafka通知主题,由下游服务消费后推送给用户。
2. Kafka延迟消息队列
- 如果用Kafka 2.4及以上版本,可结合时间轮调度实现延迟消息;也可以用第三方延迟队列插件(比如kafka-delay-queue)。
- 新增表A记录时,计算延迟时长(deadline_time - 当前时间 - 提前通知的时间),把消息发去延迟队列,到点后自动触发,推送通知给用户。
- 存量数据可以批量计算延迟时间,一次性写入延迟队列完成初始化,后续新增数据实时处理。
3. 分布式调度框架分片处理
- 用XXL-Job、Elastic-Job这类分布式调度框架,把表A数据按
deadline_time分片,每个调度节点只处理自己分片内的记录。 - 框架自带分布式锁和分片策略,天然避免多进程冲突,处理完符合条件的记录后发Kafka消息即可。
4. CDC捕获变更+Redis延迟队列
- 用Debezium等CDC工具监听表A的新增/更新操作,捕获到记录后先发送到Kafka。
- 下游消费服务收到消息后,根据
deadline_time计算到期时间,把记录存入Redis的ZSet(按到期时间排序),定时扫描ZSet取出到期的记录,推送通知。 - 存量数据可以一次性导入Redis ZSet完成初始化。
内容的提问来源于stack exchange,提问作者sonnv0812
相关产品推荐
相关产品推荐

