0

我目前正在尝试设计一个可扩展的卡夫卡消费者体系结构,我遇到了一些与偏移协调问题。对我的使用情况来说很重要的一点是,卡夫卡消费的每条消息只需处理一次卡夫卡工作/抵消协调与消费者

就拿问题的说明如下:(!业务逻辑,耶)

  1. 消费者从卡夫卡检索消息
  2. 消费者处理消息
  3. 消费者完成处理时,增量本地偏移
  4. 消费者尝试将偏移量返回给kafka
  5. 此网络呼叫因X原因而失败
  6. 上述错误,或别的,使消费者崩溃之前偏移提交可以重试
  7. 系统协调器带来了另一个消费者,然后取出过时偏移
  8. 同样的消息被检索到,并重新处理(差!)

对于那些比我具有更多分布式系统经验的人,您可能已经认识到,这是(或多或少)应用于Kafka偏移/工作结果协调的两个将军问题。

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

回答

0

这种问题在系统与卡夫卡的常见问题解答suggests之间的界限上很常见,以便使用事务来实现一次性交付担保。

您提出了一个担忧,即事务的需要会限制SQL解决方案的存储选择。这是不正确的,因为许多像Riak,Cassandra,RethinkDB或CockroachDB这样的NoSQL解决方案都具有诸如单文档原子或比较 - 设置操作之类的机制,这些操作可以用作ACID事务的替代或作为客户端的基础ACID交易。

有关更多信息,请参阅How to manage transactions over multiple databases问题,因为多分片交易的算法也可以在多密钥级别上正常工作。