【发布时间】:2021-01-30 16:01:32
【问题描述】:
例如,我有一个具有 2 个分区的主题,并且一个使用 defaultpartitioner(我假设为循环)的生产者写入该主题。在某些时候,分区 1 变得不可用,因为所有副本代理都离线了。假设消息没有指定键,生产者会重新发送消息到分区 2 吗?还是只是卡住了?
【问题讨论】:
标签: apache-kafka kafka-producer-api
例如,我有一个具有 2 个分区的主题,并且一个使用 defaultpartitioner(我假设为循环)的生产者写入该主题。在某些时候,分区 1 变得不可用,因为所有副本代理都离线了。假设消息没有指定键,生产者会重新发送消息到分区 2 吗?还是只是卡住了?
【问题讨论】:
标签: apache-kafka kafka-producer-api
这是一个有趣的问题,我们应该从更广泛(集群)的角度来看待它。
在某些时候,分区 1 变得不可用,因为所有副本代理都离线了。
我看到以下场景:
在场景“1”中,这意味着您仍然有足够的代理处于活动状态,因为复制因子是主题范围的,而不是基于分区的配置。在这种情况下,一旦第一个代理出现故障,其数据就会被移动到另一个代理,以确保您的分区始终有足够的同步副本。
在场景“2”中,两个分区都不可用,您的 KafkaProducer 最终会超时。现在,这取决于您是否有其他活跃的代理可以接收分区的数据。
在场景“3”中,死副本将转移到正在运行的代理。在此期间,KafkaProducer 只会写入分区 2,因为这是主题中唯一可用的分区。一旦分区 1 有足够的同步副本,生产者将再次开始为两个分区生产。
实际上,我可以想到更多的场景。如果您需要更具体的答案,您需要指定
假设消息没有指定key,生产者会重新发送消息到分区2吗?
KafkaProducer 不会将之前发送到分区 1 的数据重新发送到分区 2。写入分区 1 的任何内容都将保留在分区 1 中。
【讨论】: