我目前正在尝试设计一个可扩展的卡夫卡消费者体系结构,我遇到了一些与偏移协调问题。对我的使用情况来说很重要的一点是,卡夫卡消费的每条消息只需处理一次。卡夫卡工作/抵消协调与消费者
就拿问题的说明如下:(!业务逻辑,耶)
- 消费者从卡夫卡检索消息
- 消费者处理消息
- 消费者完成处理时,增量本地偏移
- 消费者尝试将偏移量返回给kafka
- 此网络呼叫因X原因而失败
- 上述错误,或别的,使消费者崩溃之前偏移提交可以重试
- 系统协调器带来了另一个消费者,然后取出过时偏移
- 同样的消息被检索到,并重新处理(差!)
对于那些比我具有更多分布式系统经验的人,您可能已经认识到,这是(或多或少)应用于Kafka偏移/工作结果协调的两个将军问题。
我想过在一个(可能是SQL)数据库事务中提交偏移量和工作结果,但将这些实现绑定在一起,并限制了我的数据存储选项(另外,如果我移动数据存储到没有交易的东西?)。另一个可能的解决方案是散列每条消息并使用bloom过滤器来概率地防止重复处理,但是现在我们开始增加我最好避免的复杂性。