卡夫卡与消费者的工作/抵消协调

时间:2016-04-11 20:41:18

标签: apache-kafka distributed distributed-transactions kafka-consumer-api

我目前正在尝试为kafka设计一个可扩展的消费者架构,而且我遇到了一些偏移协调问题。对于我的用例而言,kafka使用的每条消息都只需处理一次就很重要。

请参阅以下内容以说明问题:

  1. 消费者从Kafka检索消息
  2. 消费者处理消息(业务逻辑,耶!)
  3. 消费者完成处理,增加本地偏移量
  4. 消费者尝试将偏移量提交回kafka
  5. 此网络呼叫因X原因而失败
  6. 上述错误或其他任何原因导致使用者在重试偏移提交之前崩溃
  7. 系统协调器会启动另一个使用者,然后获取过时的偏移量
  8. 检索并重新处理相同的消息(坏!)
  9. 对于那些拥有比我更多分布式系统经验的人,你可能已经认识到这是(或多或少)应用于Kafka偏移/工作结果协调的Two Generals问题。

    我考虑过在一个(可能是SQL)数据库事务中提交偏移量和工作结果,但是这些实现将这些实现联系在一起并限制了我的数据存储选项(同样,如果我将数据存储移动到什么东西没有交易?)。另一种可能的解决方案是散列每条消息并使用布隆过滤器来概率地防止重复处理,但现在我们开始增加复杂性,我最好还是希望避免。

1 个答案:

答案 0 :(得分:0)

这种问题在系统与Kafka常见问题suggests之间的界限中很常见,以便使用交易来实现一次交付保证。

您提出了一个问题,即对事务的需求会限制SQL解决方案的存储选择。事实并非如此,因为许多NoSQL解决方案(如Riak,Cassandra,RethinkDB或CockroachDB)都具有单文档原子或比较和设置操作等机制,可用作ACID事务的替代品或作为客户端的基础ACID交易。

请参阅How to manage transactions over multiple databases问题以获取更多信息,因为多分片事务的算法也可以在多键级别上正常工作。