反复制作到Apache·Kafka,不同的偏移量(正好一次(语义)

ma8fv8wu  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(280)

在尝试实现一次语义的同时,我在kafka官方文档中发现:
只有一次交付需要与目标存储系统合作,但kafka提供了补偿,这使得实现这一点变得简单。
这是否意味着我可以使用(topic、partiton、offset)元组作为唯一的主标识符来实现重复数据消除?一个示例实现是使用rdbms和这个元组作为大型处理事务中插入操作的主键,如果由于已有主键而无法再插入,则事务将失败。
我认为这个问题相当于:
生产者在检测到可能的失败后重试发送消息时是否对消息使用相同的偏移量,还是每次重试都获得自己的偏移量?
如果在重试时重新使用偏移量,使用者显然会看到多条具有相同偏移量的消息。另一个问题,可能与此有关:
当单个或多个生产商生产同一个主题时,一个消费者看到的偏移量序列中是否存在“间隙”?
另一种可能性是,偏移量的确定,例如,仅由或在信息到达负责该工作的领导时确定(这意味着,如果没有听取制片人建议的偏移量,则可能没有间隙/偏移跳跃,但是对于重复的消息也有不同的偏移量,我必须在应用程序级别的消息中使用自己的唯一标识符)。

wtzytmuj

wtzytmuj1#

回答我自己的问题:
偏移量完全由服务器生成(更准确地说:由相应分区的负责人生成),而不是由产生偏移量的客户机生成。然后在product响应中将其发送回生产者。所以:
生产者在检测到可能的失败后重试发送消息时是否对消息使用相同的偏移量,还是每次重试都获得自己的偏移量?
否(请参阅下面的更新!)生产者不确定偏移量,两个相同/重复的应用程序消息可以具有不同的偏移量。因此,偏移量不能用于标识用于生产者重复数据消除目的的消息,必须在应用程序消息中定义自定义uid((来源)
当单个或多个生产商生产同一个主题时,一个消费者看到的偏移量序列中是否存在“间隙”?
由于每个分区只有一个引线来保持当前偏移量,并且(使用默认配置)该引线仅在发生故障时传输到活动同步副本,我假设在为分区选择新的引线时,最新使用的偏移始终是正确的,因此最初不应该有任何偏移间隙或跳转。但是,由于日志压缩特性,在某些情况下(假设启用了日志压缩),当压缩启动后再次使用分区的已提交消息时,偏移流中确实可能存在间隙((来源)

更新(Kafka>=0.11.0)

从kafka版本0.11.0开始,制作者现在额外发送一个序列号和他们的请求,然后由领导者使用该序列号和制作者的id来消除请求中的重复数据。因此,对于0.11.0,生产者端实现一次语义的前提条件是由kafka本身给出的,并且不需要在应用程序的消息中发送另一个唯一的id或序列号。因此,问题1的答案现在也可能是肯定的。但是,请注意,只有在使用者永不失败的情况下,才有可能实现一次语义。一旦使用者失败了,仍然需要注意使用者端的重复消息处理。

相关问题