有一个由3个节点组成的Kafka(版本2.2.0
)集群。一个节点人为地不可用(网络断开)。然后,我们有以下行为:
我们将记录发送给具有给定主题分区(到特定分区,例如#0)的生产者。
我们从生产者那里收到记录元数据,该数据确认已被确认。
此后,我们立即轮询分配给相同主题分区的消费者,并从记录的元数据中获取一个偏移量。轮询超时设置为30秒。不返回任何数据(返回一个空集)。
这种情况有时会不一致(在描述的情况下,一个Kafka节点发生故障)。
从本质上来说,我的问题是:是否应该立即向确认的消费者提供数据?如果没有,合理的超时时间是多少?
UPD:一些配置详细信息:
答案 0 :(得分:1)
生产者上的默认设置acks
是1
。这意味着生产者仅等待领导者副本的确认。如果领导者在确认后立即去世,则消息将不会传递。
是否应该立即为消费者提供数据?是的,通常每个默认值的延迟应该很小,每个默认值的有效范围应该在毫秒范围内并且没有负载。
如果要确保消息不会丢失,除了min.insync.replicas = 2之外,还必须将生产者配置为“ acks = all”。这将确保所有同步副本均确认该消息,并且确保至少有2个节点可以。因此,仍然允许您丢失一个节点并罚款。丢失2个节点,您将无法发送消息,但即使这样,消息也不会丢失。