1

我想清楚地指出镜像制造商的 Kafka Parallelism 模型。

对于我在消费者方面的理解:

  • CONSUMER GROUP 是一组消费者。该组的每个消费者都可以阅读一个或多个主题。

  • 该组的一个 CONSUMER 可以有多个流,即从主题中读取的线程数,最佳实践是使用一个线程进行分区。

我的疑问是:我们是用单线程实现多个消费者距离还是一个消费者用多个线​​程?一个消费者组是指一组消费者还是一个多线程消费者?

我发现很难从文档中指出这些问题,我想知道我是否错了。

即使在生产者方面,这些考虑是否也适用于双重方式?

4

1 回答 1

8

MirrorMaker(MM)中的线程模型如下:

MM 部署N个线程。

  1. 每个线程实例化并使用一个消费者。那是 MM 线程和消费者之间的1:1映射。
  2. 每个线程共享同一个生产者。那是线程和生产者之间的N:1映射。

因此,您定义为 MM 属性的流的数量(由传递给num.streams属性的值给出)对应于 MM 线程的数量,并且如上所述也对应于消费者的数量。

现在,您的具体问题的答案是,此数字还对应于消耗主题和分区中记录的线程(或流)总数。

为什么这在 MM 中有点令人困惑,因为它让您可以选择使用旧的高级消费者或新的消费者。但是在这两种情况下,消耗记录的线程总数num.streams = N分别是由于以下原因:

  1. 当使用旧的消费者高级 API 时,每个消费者部署来消费记录的线程数被 MM 硬编码为 1 个线程。(您可以通过查看传递给MirrorMaker.scalacreateMessageStreamsByFilter中的方法的参数来确认这一点)。由于每个 MM 线程都会实例化一个消费者,因此我们最终会得到N个线程来消费记录。

  2. 如果使用新的消费者 API,消费者 API 不会在后台部署线程来消费记录(有一个心跳线程实例化,但这与讨论无关)。因此,这里使用记录的线程数等于 MM 线程数更直接,因为 MM 将一个线程映射到它实例化的每个消费者。

希望这可以帮助。

于 2016-11-04T18:54:36.690 回答