卡夫卡消费者/生产者如何提交消息/分区?

时间:2020-05-08 12:45:07

标签: apache-kafka

我刚刚开始使用kafka,并开始在本地计算机上使用kafka。我可以使用Confluent提供的flask_jwt_extended来生成和使用消息。

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

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

首先,我在这里想念吗?

此外,我经常在两个客户端碰到一个短语“ commiting messages / offsets”。将消息/偏移提交给kafka到底意味着什么?

1 个答案:

答案 0 :(得分:1)

生产者将把每个产生的消息存储在本地缓冲区队列中。生产者需要明确地将消息从其推送到kafka集群。

您可以配置该批次的大小,确认等,但是在调用minkowski,p=1.6后无需“明确推送”

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

)从缓冲区中提取这些消息。

你是对的。

首先,我在这里想念吗?

不,这些概念对于理解调优/性能很重要,您应该在配置生产者和消费者时格外小心,但它们不应影响您对生产者/消费者进行编码的方式(例如,不要做任何技巧)为您的poll()计时)。

在生产方,如果您想退出发布消息(这是为了支持两个阶段的提交),则有一个事务概念,但是我不确定这在Python API中如何工作。除此之外,您还应考虑致电cosumer.poll()时发送的消息。您不必在每个producer.produce()之后致电producer.flush()

在使用方,有提交和偏移量的概念。在较高的层次上,您可以这样考虑:producer.produce()是从API询问消息,但是为了便于理解,您是从主题询问消息。现在,当您处理该主题中的消息时,您可能需要某种方式让Kafka知道您已经阅读并处理了一些消息,并且不想再次看到它们。

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