我正在为基于 Kafka 的数据处理管道中的消费者重试设计一个架构。我们正在使用 Kafka 生产者和消费者,并正在考虑重试主题,如果消费出错,将在这些主题上发送消息。将会有消费者以一定的节奏运行这些重试主题。
我读了很多参考架构,但没有一个讨论如何在消息消费失败期间维护排序保证。我举个例子:
我们的 Kafka 消息包含具有对象和操作类型(可以是 CREATE/UPDATE/DELETE)的有效负载。我们对
object_id
上的消息进行分区,以确保该对象上的操作是有序的。但是,如果消息在消费时失败,您是否应该自动将后续消息标记为失败,甚至不尝试处理它们?你如何维持这种状态? 是否有任何参考架构可以解决这个问题?
我建议使用缓存来协调这一点 - 每当消息要重试时,就增加 object_id 键。同样,每当从重试主题成功消费一条消息时,就递减键。
现在,在尝试消费消息之前,只需检查是否存在与object_id对应的值>0的key,如果存在,则直接发送重试。
其中键为object_id
,值为重试主题的级别。
object_id
存在,则将事件直接发送到主题。