kafka之延迟队列
kafka之延迟队列
一、背景
用户营销业务场景中存在大量延迟消息处理,如用户访问某物品未下单,15分钟后给该用户推送一张优惠券等,需要支持上亿用户推送,并且低延迟。现有技术方案:
- redis过期监听 :内存存储,不适用大数据量,并且过期删除不精确,存在惰性删除,可能改key一直没有过期;
- JDK自带延迟队列:单机,非分布式;
- rocketMQ: 延迟时长最大24小时,业务场景需要支持天以上,存储成本变大
- 数据库+定时任务:引入新数据库、大数据量还需要进行分库分表,并且存在延迟,对数据库压力较大
具体可以参考:https://mp.weixin.qq.com/s/OmbyxkufVm-XzwIv_A514w
以上技术缺点和本身系统大量应用kafka中间件,吞吐量高,考虑基于kafka开发延迟队列组件,同时也不需要引入第三方中间件
二、延迟队列设计思路
设计思路来自RocketMQ延迟消息:使用rocketmq延迟消息时,服务端实际上发送到另一个topic,并通过周期任务轮询检查延迟消息是否到期,到期才转发到目标topic,达到延迟效果。
参考该思路,自建延迟消息topic,在客户端消费者消费延迟消息,检查是否到期,到期则转发到目标topic&