使用集群 Kafka 保证交付
Guaranteeing delivery with clustered Kafka
根据最近的一篇文章,Kafka 可以在复制配置下丢弃已确认的消息:
https://aphyr.com/posts/293-call-me-maybe-kafka
如果必须绝对确定消息已发送给消费者,此解决方案是否适用于所有情况:
- 建立两个主题,一个发送,一个接收
- 生产者发送消息,包括发送主题上的令牌(UUID)
- producer将发送的消息和token保存到本地存储,独立于Kafka
- 只有当生产者从消费者那里收到关于接收主题的确认消息时,生产者才会从本地存储中删除已发送的消息,其中包含在发送主题上发送的相同令牌。
- 生产者使用相同的令牌定期重新发送消息,直到收到确认。唯一令牌确保即使消息被接收两次(第一次由于任何原因未被确认)它也被消费者识别为重复。
即使在消息丢失的情况下它也能正常工作吗?这个图案有名字吗?
这似乎有点过度设计。跟踪消费者端的偏移量并提交或不提交偏移量就足够了,具体取决于您认为下游系统成功处理消息的内容。
Aphyr 发现的裂脑问题已通过 unclean.leader.election.enable
设置修复(我认为在 0.8.2.0 中),您需要将其设置为 false
(默认为 true
,因为它是最后一个-采取措施)。
您还应该查看 ack
producer configuration setting,它决定了有多少同步副本需要确认写入才能被视为成功。
您可以在页面底部附近阅读有关这些设置和 Kafka 提供的一般交付保证的更多信息 here。
PS 这可能值得跟踪 issue。
希望对您有所帮助:)
根据最近的一篇文章,Kafka 可以在复制配置下丢弃已确认的消息:
https://aphyr.com/posts/293-call-me-maybe-kafka
如果必须绝对确定消息已发送给消费者,此解决方案是否适用于所有情况:
- 建立两个主题,一个发送,一个接收
- 生产者发送消息,包括发送主题上的令牌(UUID)
- producer将发送的消息和token保存到本地存储,独立于Kafka
- 只有当生产者从消费者那里收到关于接收主题的确认消息时,生产者才会从本地存储中删除已发送的消息,其中包含在发送主题上发送的相同令牌。
- 生产者使用相同的令牌定期重新发送消息,直到收到确认。唯一令牌确保即使消息被接收两次(第一次由于任何原因未被确认)它也被消费者识别为重复。
即使在消息丢失的情况下它也能正常工作吗?这个图案有名字吗?
这似乎有点过度设计。跟踪消费者端的偏移量并提交或不提交偏移量就足够了,具体取决于您认为下游系统成功处理消息的内容。
Aphyr 发现的裂脑问题已通过 unclean.leader.election.enable
设置修复(我认为在 0.8.2.0 中),您需要将其设置为 false
(默认为 true
,因为它是最后一个-采取措施)。
您还应该查看 ack
producer configuration setting,它决定了有多少同步副本需要确认写入才能被视为成功。
您可以在页面底部附近阅读有关这些设置和 Kafka 提供的一般交付保证的更多信息 here。
PS 这可能值得跟踪 issue。
希望对您有所帮助:)