技术方案
方案背景
Kafka队列消息消费处理过程中,发生处理异常,需要实现重试机制,并基于重试次数实现不同延迟时间重试方案。
方案介绍
通过实现Kafka延迟队列来实现消息重试机制。
目标:
- 支持所有业务场景的延迟重试
- 支持多级别延迟重试
- 保证消息 最少消费一次
核心内容:
-
延迟队列,Kafka本身不支持延迟队列机制,这里我们通过定义多种Topic来扩展实现。例如Topic-1、Topic-2、Topic-3 分别代表延迟1分钟、2分钟、3分钟的队列。
a. 每种延迟级别独立一个Topic
b. 分区数建议与延迟调度服务部署量一致,以便于调度服务简化处理。建议值 2
-
延迟队列消费调度服务,负责从延迟队列拉取消息。
a. 判断消息是否达到延迟时间,
i. 若未达到,则delay 延迟时间-当前时间;
ii. 若已达到,则将消息转发至对应的业务消息队列。
b. 集群部署数量 建议值 2,消费部署数与分区数一致,以保证数据消费顺序及处理及时性
c. 若重试次数已达到最大值,则丢失数据,并发送异常警报(钉钉)
d. 考虑延迟队列修改offset,重新处理消息机制
-
业务消费服务改造,
a. 数据处理异常时,组装延迟重试消息,将异常数据推送至延迟队列消息。
b. 鉴于当前业务消费 BulkCopy 批量处理逻辑
技术架构
架构图
Topic-1、Topic-2、Topic-3 分别代表延迟1分钟、2分钟、3分钟的队列
核心流程
