kafka 如何防止生产者重复提交消息

kafka 如何防止生产者重复提交消息

不是防止重复消费,而是重复提交


回答:

先说结论:不可能;如果大幅牺牲性能的话,可能降低概率、但不能完全确保。

先看官方文档:

REF: https://kafka.apache.org/08/d...
So effectively Kafka guarantees at-least-once delivery by default and allows the user to implement at most once delivery by disabling retries on the producer and committing its offset prior to processing a batch of messages. Exactly-once delivery requires co-operation with the destination storage system but Kafka provides the offset which makes implementing this straight-forward.

大意就是 Kafka 的设计目标就是 At-Least-Once,至少投递一次,保证消息不丢失。这种情况下一定会有消息重复生产。这也是为了高可用的目标而带来的必然后果。

如果就是不想有消息重复,官方也给出了两个解决方案:

REF: https://cwiki.apache.org/conf...
There are two approaches to getting exactly once semantics during data production:

  1. Use a single-writer per partition and every time you get a network error check the last message in that partition to see if your last write succeeded
  2. Include a primary key (UUID or something) in the message and deduplicate on the consumer.

其中第二种方案就是加消息 ID,然后在消费者侧去重,这个不是题主想要的,我们略过。

第一种说的是每次发送前、先去对应分区里查看最近一条消息是不是重复的,如果重复则跳过发送。(提示:这个需要你业务里自己实现相应的逻辑,Kafka 本身没这个功能。)

但它没有说明的是,如果你有多个生产者的时候,显然是需要加锁的,那么带来的问题就是性能急遽下降。

况且即便加锁,也只能保证你的生产者自己不会重复发送,但 Kafka 内部的错误重试机制你没法控制。所以它只能降低重复生产的几率,却不能使之变成 0。

综上所述,就得到了开头给出的结论。

以上是 kafka 如何防止生产者重复提交消息 的全部内容, 来源链接: utcz.com/p/938097.html

回到顶部