例如,我有一个有2个分区的主题,一个生产者使用defaultpartitioner(我假设是循环)写入该主题。在某个时候,分区1变得不可用,因为所有副本代理都脱机。假设消息没有指定的密钥,生产者会将消息重新发送到分区2吗?或者只是被卡住了?
pkwftd7m1#
这是一个有趣的问题,我们应该从更广泛的(集群)Angular 来看待它。在某个时候,分区1变得不可用,因为所有副本代理都脱机。我看到以下场景:分区1的所有副本代理与分区2的副本代理不同。分区1的所有副本代理与分区2的相同。某些副本代理与分区2相同。在场景“1”中,这意味着您仍然有足够的代理处于活动状态,因为复制因子是一个主题范围的配置,而不是基于分区的配置。在这种情况下,一旦第一个代理停止工作,它的数据将被移动到另一个代理,以确保分区始终有足够的同步副本。在场景“2”中,两个分区都不可用,您的kafkaproducer最终将超时。现在,这取决于是否有其他代理处于活动状态并且可以接收分区的数据。在场景“3”中,死掉的副本将转移到正在运行的代理。在此期间,kafkaproducer将只写入分区2,因为这是主题中唯一可用的分区。一旦分区1有足够的同步副本,生产者将开始再次生产两个分区。实际上,我能想到更多的场景。如果你需要一个更具体的答案,你需要具体说明你有多少经纪人,你的复制因子到底是什么以什么样的时间顺序哪个经纪人倒下。假设消息没有指定的密钥,生产者会将消息重新发送到分区2吗?kafkaproducer不会将以前发送到分区1的数据重新发送到分区2。写入分区1的内容将保留在分区1中。
1条答案
按热度按时间pkwftd7m1#
这是一个有趣的问题,我们应该从更广泛的(集群)Angular 来看待它。
在某个时候,分区1变得不可用,因为所有副本代理都脱机。
我看到以下场景:
分区1的所有副本代理与分区2的副本代理不同。
分区1的所有副本代理与分区2的相同。
某些副本代理与分区2相同。
在场景“1”中,这意味着您仍然有足够的代理处于活动状态,因为复制因子是一个主题范围的配置,而不是基于分区的配置。在这种情况下,一旦第一个代理停止工作,它的数据将被移动到另一个代理,以确保分区始终有足够的同步副本。
在场景“2”中,两个分区都不可用,您的kafkaproducer最终将超时。现在,这取决于是否有其他代理处于活动状态并且可以接收分区的数据。
在场景“3”中,死掉的副本将转移到正在运行的代理。在此期间,kafkaproducer将只写入分区2,因为这是主题中唯一可用的分区。一旦分区1有足够的同步副本,生产者将开始再次生产两个分区。
实际上,我能想到更多的场景。如果你需要一个更具体的答案,你需要具体说明
你有多少经纪人,
你的复制因子到底是什么
以什么样的时间顺序哪个经纪人倒下。
假设消息没有指定的密钥,生产者会将消息重新发送到分区2吗?
kafkaproducer不会将以前发送到分区1的数据重新发送到分区2。写入分区1的内容将保留在分区1中。