【发布时间】:2016-08-02 05:08:42
【问题描述】:
我目前正在尝试为 kafka 设计一个可扩展的消费者架构,但在偏移协调方面遇到了一些问题。对于我的用例来说,kafka 使用的每条消息都被处理一次,这一点很重要。
请看以下内容来说明问题:
- 消费者从 Kafka 检索消息
- 消费者处理消息(业务逻辑,耶!)
- 消费者完成处理,增加本地偏移量
- 消费者尝试将偏移提交回 kafka
- 此网络调用因 X 原因失败
- 上述错误或其他任何错误都会导致消费者在重试偏移提交之前崩溃
- 系统编排器启动另一个消费者,然后获取过时的偏移量
- 检索到相同的消息并重新处理(错误!)
对于那些比我有更多分布式系统经验的人,您可能已经认识到这(或多或少)是适用于 Kafka 偏移/工作结果协调的两个将军问题。
我考虑过在(可能是 SQL)数据库事务中提交偏移量和工作结果,但这将这些实现联系在一起并且还限制了我的数据存储选项(另外,如果我将数据存储移动到没有交易的东西?)。另一种可能的解决方案是散列每条消息并使用布隆过滤器来概率性地防止重复处理,但现在我们开始增加我希望避免的复杂性。
【问题讨论】:
标签: apache-kafka distributed distributed-transactions kafka-consumer-api