我想分享我所使用的问题和解决方案,因为如果人们有其他解决方案,请与我分享,这可能对他人有益。
我有一个表,该表包含1,000,000行,我想将其发送到kafka,并将数据分布在20个分区之间。 我想在生产者到达数据结尾时通知消费者,我不想在生产者和消费者之间建立直接联系。
我知道kafka被设计为逻辑无穷的数据流,但是我仍然需要标记特定表的末尾。
答案 0 :(得分:0)
解决方案1:
我实际上希望每个分区上的最后一条消息表明它是最后一条消息。
我可以提前做一些工作,创建一些随机消息密钥,发送按密钥划分的消息,并测试每条消息的目标分区。由于按键进行分区是确定性的(对于给定的分区数),我想准备一个键与目标分区的映射。例如,密钥:“ xyz”定向到分区#0,密钥“ hjk”定向到分区#1等,最后具有反向映射,因此对于分区0,请使用密钥“ xyz”,对于分区1,请使用密钥'hjk'等。
现在,我可以使用随机分区策略发送整个表格(最后20行除外),因此,对于几乎整个表格,数据分布在各个分区之间。 当我进入最后20行时,我将使用分区键将其发送,并为每个邮件分区键进行设置,以将邮件哈希到另一个分区。这样,20个分区中的每个分区都将获取最后20条消息之一。对于最后20条消息中的每条消息,我将设置一个相关的标头,其中将标明这是最后一条。
解决方案2: 与解决方案1类似,但是将整个表散布到随机分区。现在发送20条元数据消息,我将使用按键分区策略(通过设置适当的键)将其定向到20个分区。
解决方案3: 有其他控制主题。在将表完全发送到数据主题之后,向控制主题发送一条消息,说明表已完成。使用者将需要不时测试控制主题,当它收到“数据结束”消息时,它将知道,如果到达分区的末尾,则实际上到达了该分区的数据末尾。此解决方案不太灵活,建议不要使用,但我也写了它。
答案 1 :(得分:0)
另一种解决方案是使用S3的开源类似物(例如minio.io)。生产者可以上传数据,发送带有对象存储链接的消息。收集后,消费者将从对象存储中删除数据。