只添加一次Kafka主题

时间:2018-05-18 01:41:39

标签: apache-kafka

自0.11以来,Kafka Streams提供了一次性保证,但他们对端到端的“结束”的定义似乎是“卡夫卡主题”。

对于实时应用程序,第一个“结束”通常不是Kafka主题,而是某种将数据(可能通过多个层和网络)输出到Kafka主题的应用程序。

在面对网络故障和应用程序崩溃并重新启动时,Kafka是否提供了一些准确添加到主题的内容?或者我是否必须使用Kafka的至少一次语义,并通过一些唯一标识符将具有潜在重复的主题重复删除到另一个完全一次的主题中?

编辑由于受欢迎的需求,这是一个特定的用例。我有一个客户端C,它创建消息并将它们发送到服务器S,服务器S使用KafkaProducer将这些消息添加到Kafka主题T.

面对

,我如何保证
  • C,S和Kafka群集成员的崩溃
  • 临时网络问题

C创建的所有消息最终都在T中,恰好一次(和 - 每个分区 - 以正确的顺序)?

我当然会让C重新发送所有没有从S获得确认的消息 - >至少一次。但是为了使其完全一次,C发送的消息需要包含某种ID,以便可以执行重复数据删除。那,我不知道我怎么能和卡夫卡一起做。

2 个答案:

答案 0 :(得分:0)

Kafka的一次性功能,特别是“幂等生产者”可以帮助您解决服务器崩溃和网络问题。

您可以通过Producer config enable.idempotence=true启用与其他任何配置一起传入的幂等性。如果服务器崩溃或存在任何网络问题,这可以确保每条消息只写入一次并以正确的顺序写入。

Kafka的一次性功能,如果制作人崩溃,则不提供支持。对于这种情况,您需要编写手动代码,以确定在崩溃之前成功附加到主题的消息(通过使用消费者)并继续发送您停止的位置。作为替代方案,您仍然可以按照您的提及对消费者方进行重复数据删除。

答案 1 :(得分:0)

您可能想看看kafka的Log压缩功能。如果您对所有重复邮件都有唯一的密钥,它将为您删除重复邮件。

https://kafka.apache.org/documentation/#compaction

更新:

日志压缩不是很可靠,但是您可以更改某些设置以使其按预期工作。

更有效的方法是使用kafka流。您可以使用KTables实现此目的。