使用 Kafka 消费者重试来维护订购保证
Posted
技术标签:
【中文标题】使用 Kafka 消费者重试来维护订购保证【英文标题】:Maintain Ordering Guarantees With Kafka Consumer Retries 【发布时间】:2018-07-24 06:15:17 【问题描述】:我正在提出一种架构,用于在基于 Kafka 的数据处理管道中重试消费者。我们正在使用 Kafka 生产者和消费者,并且正在考虑重试主题,如果它们在消费时出错,将发送哪些消息。会有消费者以一定的节奏在这些重试主题上运行。
我阅读了许多参考架构,但没有一篇谈到如何在消息消费失败期间维护排序保证。举个例子吧:
我们的 Kafka 消息包含具有对象和操作类型(可以是 CREATE/UPDATE/DELETE)的有效负载。我们在object_id
上对消息进行分区,以确保对该对象的操作是有序的。但是,如果一条消息在消费时失败,您是否应该自动将具有相同object_id
的后续消息标记为失败,甚至不尝试处理它们?以及如何保持这种状态?
是否有解决此问题的参考架构?
【问题讨论】:
【参考方案1】:是的,您需要有一种机制,如果具有相同 object_id 的一条消息失败并重试,则具有相同 object_id 的所有后续消息也将直接重试。
我建议使用缓存来协调这一点 - 每当消息重试时,增加 object_id 键。同样,只要从重试主题成功消费了一条消息,就减少密钥。
现在,你只需要在尝试消费消息前检查object_id对应的值>0的key是否存在,如果存在,直接发送重试。
【讨论】:
【参考方案2】:如果存在多级重试主题,维护分布式key-value缓存,key为object_id
,value为重试主题级别。
在使用此缓存检查消息时,如果存在object_id
,则直接向主题发送事件。
【讨论】:
【参考方案3】:最简单的方法是在这里设置一个阻塞重试策略:即不使用重试主题,而是阻塞消费者(让线程休眠一段时间),然后重试相同的消息。在这种情况下,您可以始终保证订单。 如果你选择使用 retry-topic 来代替,你会很头疼确保订单得到保证。
【讨论】:
以上是关于使用 Kafka 消费者重试来维护订购保证的主要内容,如果未能解决你的问题,请参考以下文章
Flink Checkpoint是否支持Kafka 数据消费状态的维护?
Flink Checkpoint是否支持Kafka 数据消费状态的维护?
Kafka在高并发的情况下,如何避免消息丢失和消息重复?kafka消费怎么保证数据消费一次?数据的一致性和统一性?数据的完整性?