我正在基于Kafka的数据处理管道中提出用于消费者重试的体系结构。我们正在使用Kafka的生产者和消费者,并正在考虑重试主题,如果这些主题在使用中出错,将在该主题上发送消息。将会以某种节奏在这些重试主题上运行消费者。
我阅读了许多参考体系结构,但是没有人谈论在消息使用失败期间如何维护排序保证。让我举个例子:
我们的Kafka消息包含具有对象和操作类型(可以是CREATE / UPDATE / DELETE)的有效负载。我们在object_id
上对消息进行分区,以确保对该对象的操作进行了排序。但是,如果一条消息使用失败,是否应该自动将带有相同object_id
的后续消息标记为失败,甚至不尝试对其进行处理?您如何保持这种状态?
有没有参考架构可以解决这个问题?
答案 0 :(得分:1)
是的,您需要有一种适当的机制,如果一个具有相同object_id的消息失败并要重试,那么所有随后的具有相同object_id的消息也将直接重试。
我建议使用缓存来协调这一点-每当消息重试时,请增加object_id键。同样,只要从重试主题成功使用了一条消息,就减小密钥。
现在,您只需要在尝试使用消息之前检查是否存在键值大于0的object_id对应的键,如果是,则直接将其发送以重试。
答案 1 :(得分:0)
最简单的方法是在此处设置阻止重试策略:即,不使用重试主题,而是阻止使用方(将线程休眠一段时间),然后重试同一条消息。在这种情况下,您可以始终保证订单。 如果您选择使用retry-topic,那么您将很难确保订单得到保证。