【发布时间】:2021-11-29 11:57:02
【问题描述】:
如果将SeekToCurrentErrorHandler 与有状态重试一起使用,这样每次重试都会从代理轮询消息,那么在很长的重试周期内,消费者组重新平衡可能会导致分区被重新分配给另一个消费者。因此,有状态的重试周期/尝试将被重置,因为新的消费者不知道重试的状态。
举个例子,如果重试的最大周期是 24 小时,但消费者组重新平衡平均每 12 小时发生一次,那么重试永远不会完成,并且消息(及其后面的消息)最终会从一旦超过保留期,主题。 (假设这次可重试异常的原因没有解决)。消息不会像预期的那样在 24 小时后在 DLT 上结束,因为重试不会因重置而用尽。
我假设即使消费者通过重新轮询消息来重试,也不能保证在重新平衡之后该消费者将保留对该分区的分配。还是我们可以确信,只要这个消费者实例还活着,它通常会保留对它正在轮询的分区的分配?
是否有关于使用有状态重试来解决此问题的最佳实践/指南?
无状态重试意味着任何超过轮询超时的总重试时间都会导致重新平衡和重复消息传递。为了避免这种情况,重试时间必须非常有限。或者是否允许这样做,确保消费者对消息进行重复数据删除,以便可以接受重复消息并且可以配置长时间运行的无状态重试?
启用重试时间(例如,为了满足在此期间不可用的服务)使用重试主题是唯一安全且稳定的选择吗?
谢谢, 抢。
【问题讨论】:
标签: apache-kafka kafka-consumer-api spring-kafka