我正在为基于 Kafka 的数据处理管道中的消费者重试提出一个架构。我们正在使用 Kafka 生产者和消费者,并且正在考虑重试主题,如果他们在消费时出错,将在哪些主题上发送消息。会有消费者以一定的节奏在这些重试主题上运行。
我阅读了很多引用架构,但没有一个提到如何在消息消费失败时保持顺序保证。让我举个例子:
我们的 Kafka 消息包含具有对象和操作类型(可以是 CREATE/UPDATE/DELETE)的有效负载。我们根据 object_id
对消息进行分区,以确保对该对象的操作是有序的。但是,如果消息消费失败,您是否应该自动将具有相同 object_id
的后续消息标记为失败,甚至不尝试处理它们?你如何保持这种状态?
是否有任何引用架构可以解决这个问题?
最佳答案
是的,您需要有一种机制,如果一条具有相同 object_id 的消息失败并进行重试,那么所有具有相同 object_id 的后续消息也将直接进行重试。
我建议使用缓存来协调这一点 - 每当消息要重试时,增加 object_id 键。同样,每当从重试主题成功消费消息时,递减 key 。
现在,你只需要在尝试消费消息前,检查是否存在与object_id对应的>0值的key,如果存在,则直接发送重试。
关于apache-kafka - 通过 Kafka 消费者重试维护订购保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51491659/