【问题标题】:Kafka work/offset coordination with consumerKafka 与消费者的工作/偏移协调
【发布时间】:2016-08-02 05:08:42
【问题描述】:

我目前正在尝试为 kafka 设计一个可扩展的消费者架构,但在偏移协调方面遇到了一些问题。对于我的用例来说,kafka 使用的每条消息都被处理一次,这一点很重要。

请看以下内容来说明问题:

  1. 消费者从 Kafka 检索消息
  2. 消费者处理消息(业务逻辑,耶!)
  3. 消费者完成处理,增加本地偏移量
  4. 消费者尝试将偏移提交回 kafka
  5. 此网络调用因 X 原因失败
  6. 上述错误或其他任何错误都会导致消费者在重试偏移提交之前崩溃
  7. 系统编排器启动另一个消费者,然后获取过时的偏移量
  8. 检索到相同的消息并重新处理(错误!)

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

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

【问题讨论】:

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


    【解决方案1】:

    这类问题常见于系统边界和 Kafka 的 FAQ suggests 使用事务来实现一次性交付保证。

    您担心事务的需要会限制 SQL 解决方案的存储选择。这不是真的,因为许多 NoSQL 解决方案(如 Riak、Cassandra、RethinkDB 或 CockroachDB)都具有诸如单文档原子或比较和设置操作之类的机制,它们可以用作 ACID 事务的替代品或作为客户端的基础ACID 事务。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多