通过 Kafka 消费者重试维持订单保证

Sak*_*pta 3 apache-kafka kafka-consumer-api

我正在为基于 Kafka 的数据处理管道中的消费者重试设计一个架构。我们正在使用 Kafka 生产者和消费者,并且正在考虑重试主题,如果消费出错,将在这些主题上发送消息。将会有消费者以一定的节奏运行这些重试主题。

我读了很多参考架构,但没有一篇讨论如何在消息消费失败期间维护排序保证。让我举个例子吧:

我们的 Kafka 消息包含具有对象和操作类型(可以是 CREATE/UPDATE/DELETE)的有效负载。我们对消息进行分区object_id以确保对该对象的操作是有序的。但是,如果消息在消费时失败,您是否应该自动将后续消息标记为object_id失败,甚至不尝试处理它们?你如何维持这种状态?

是否有任何参考架构可以解决这个问题?

hoo*_*hal 5

是的,您需要有一种机制,其中如果具有相同 object_id 的一条消息失败并进行重试,那么具有相同 object_id 的所有后续消息也将直接重试。

我建议使用缓存来协调这一点 - 每当消息要重试时,就增加 object_id 键。同样,每当从重试主题成功消费一条消息时,就递减键。

现在,在尝试消费消息之前,只需检查是否存在与object_id对应的值>0的key,如果存在,则直接发送重试。