快捷搜索:  汽车  科技

kafka实现延时队列(中间件-kafka原理-正常)

kafka实现延时队列(中间件-kafka原理-正常)1.第一次消费失败,消息进入5秒重试队列。搭配:正常队列 重试队列 死信队列的例子如下与回退队列不同的是重试队列一般分成多个重试等级,每个重试等级一般也会设置重新投递延时,重试次数越多投递延时就越大。回退队列和死信队列都是为异常的处理提供的一种机制保障;可以将重试队列看作为回退队列的一种。消息第一次消费失败入重试队列Q1,Q1的重新投递延迟为5s,在5s过后重新投递该消息;如果消息再次消费失败则入重试队列Q2,Q2的重新投递延迟为10s,在10s过后再次投递该消息。以此类推,重试越多次重新投递的时间就越久,为此需要设置一个上限,超过投递次数就入死信队列。

正常队列、重试队列、死信队列、延时队列原理及区别

kafka实现延时队列(中间件-kafka原理-正常)(1)

中间件-kafka原理

消费失败问题

试想如果消费者在消费时发生了异常,那么就不会对这一次消费进行确认(Ack) 进而发生回滚消息的操作之后消息始终会放在队列的顶部,然后不断被处理和回滚,导致队列陷入死循环。

为了解决该问题,引入回退队列。可以为每个队列设置一个回退队列。

回退队列

消费端消费消息失败时,为防止消息无故丢失而重新将消息回滚到Broker中,这个时候可以将消息写入回退队列。

重试队列

与回退队列不同的是重试队列一般分成多个重试等级,每个重试等级一般也会设置重新投递延时,重试次数越多投递延时就越大。

回退队列和死信队列都是为异常的处理提供的一种机制保障;可以将重试队列看作为回退队列的一种。

  • 例子

消息第一次消费失败入重试队列Q1,Q1的重新投递延迟为5s,在5s过后重新投递该消息;如果消息再次消费失败则入重试队列Q2,Q2的重新投递延迟为10s,在10s过后再次投递该消息。以此类推,重试越多次重新投递的时间就越久,为此需要设置一个上限,超过投递次数就入死信队列。

搭配:正常队列 重试队列 死信队列的例子如下

kafka实现延时队列(中间件-kafka原理-正常)(2)

kafka实现延时队列(中间件-kafka原理-正常)(3)

1.第一次消费失败,消息进入5秒重试队列。

2.5秒队列投递失败,消息进入10秒重试队列;

3.10秒队列重试失败,消息进入死信队列;

这里的投递均为消费者主动拉取;

5、10、20、30……这里可以根据业务场景灵活进行配置,逐级增加延时时长。

延时队列

再来看看常用的延时队列

生产者和消费者步骤

1.延时队列并不直接写入目标topic队列,而是先写入内置delay-topic的延时队列中;

2.由DelayService针对不同延时等级的topic开启不同线程进行拉取,将达到指定时间的消息写入目标topic;

3.消费者正常订阅和消费;

kafka实现延时队列(中间件-kafka原理-正常)(4)

kafka实现延时队列(中间件-kafka原理-正常)(5)

重试队列与延迟队列区别

相同点:都是需要设置延迟级别。

区别点:延迟队列动作由内部触发,重试队列动作由外部消费端触发;延迟队列作用一次,而重试队列的作用范围会向后传递。

猜您喜欢: