【问题标题】:How does kafka consumers/producers commit messages/partitions?kafka 消费者/生产者如何提交消息/分区?
【发布时间】:2020-08-24 00:42:15
【问题描述】:

我刚刚开始使用 kafka,并开始在本地机器上使用 kafka。我可以使用 confluent 提供的python kafka client 生成和使用消息。

到目前为止我的理解是什么,

  1. kafka 客户端(即消费者和生产者)维护一个消息队列。
  2. 生产者将每条生产的消息存储在本地缓冲区队列中。并且生产者需要将消息从本地缓冲区显式推送到 kafka 集群。
  3. 在消费者端,它会以某种方式从 kafka 集群中获取消息并将其存储在本地缓冲区队列中,然后通过 api 调用(例如 poll())从缓冲区中提取这些消息

首先,我在这里失踪了吗?

此外,我经常在两个客户端都遇到“提交消息/偏移量”的短语。向 kafka 提交消息/偏移量究竟是什么意思?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    生产者,将每个生产的消息存储在本地缓冲区队列中。并且生产者需要显式地将消息推送到 kafka 集群。

    您可以配置该批次的大小,确认等,但您不需要在调用producer.produce(...)后“显式推送”

    在消费者端,它会以某种方式从 kafka 集群中获取消息并将其存储在本地缓冲区队列中,然后通过 api 调用(例如poll())从缓冲区中提取这些消息

    你是对的。

    首先,我在这里失踪了吗?

    不,这些概念对于了解调优/性能很重要,您应该注意如何配置生产者和消费者,但它们不应影响您编写生产者/消费者的方式(例如,不要做任何花招在计时你的cosumer.poll())。

    在生产方,有一个事务的概念,如果您想退出发布消息(这是为了支持两阶段提交),但我不确定这如何与 Python API 一起使用。除此之外,您应该考虑拨打producer.produce() 时发送的消息。您不需要在每个producer.produce() 之后调用producer.flush()

    在消费端,有提交和偏移的概念。在较高的层次上,您可以这样想:当您poll() 时,您正在从 API 请求消息,但为了便于理解,您正在请求来自主题的消息。现在,当您处理主题中的消息时,您可能需要某种方式让 Kafka 知道您已经阅读并处理了一些消息,并且不想再看到它们。

    每条消息在主题中都有一个偏移量(这实际上是在分区中,但我们可以保持简单,说主题)。您可以将此偏移量视为消息在主题中的位置(第一条消息0,第二条消息1,依此类推,添加的每条消息的偏移量都高于最后一条)。当您显式调用commit 时,您实际上提交了offset 并告诉Kafka 您已经阅读了到目前为止的所有消息并且不想再看到它们。

    【讨论】:

      猜你喜欢
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 2019-10-16
      相关资源
      最近更新 更多