从理论上讲,由于nodejs是单线程的,当我定义多个消费者以增加吞吐量时,如何实现并行性?
例如,如果我有一个具有4 个分区的 kafka 主题,那么在消费者端,当与 nodejs 一起使用时,我将如何能够并行消费 4 条消息。最多我可以使用单线程事件循环实现并发。
一种可能的解决方案是分叉子进程(在本例中为 3),以便假设系统有 3 个空闲核心,每个进程都可以从特定分区接收消息。但是这种方法的效率/效果如何?
实现这一目标的最佳方法是什么?
从理论上讲,由于nodejs是单线程的,当我定义多个消费者以增加吞吐量时,如何实现并行性?
例如,如果我有一个具有4 个分区的 kafka 主题,那么在消费者端,当与 nodejs 一起使用时,我将如何能够并行消费 4 条消息。最多我可以使用单线程事件循环实现并发。
一种可能的解决方案是分叉子进程(在本例中为 3),以便假设系统有 3 个空闲核心,每个进程都可以从特定分区接收消息。但是这种方法的效率/效果如何?
实现这一目标的最佳方法是什么?
在 Kafka 中,分区是并行级别。此外,Kafka 集群中的分区越多,可以实现的吞吐量就越高。
Kafka 主题被划分为多个分区,这些分区通过将数据拆分到多个代理来实现并行性。多个分区允许多个消费者并行读取一个主题。因此,为了实现并行处理,您需要将您的主题划分为多个分区。
为了增加现有主题的分区数量,您可以简单地运行
bin/kafka-topics.sh \
--zookeeper localhost:2181 \
--alter \
--topic topicName \
--partitions 40
不过,这不会移动现有数据
关于消费者、消费者组和分区的注意事项
如果你有 N 个分区,那么在同一个消费者组中最多可以有 N 个消费者,每个消费者都从一个分区中读取。当您的消费者少于分区时,一些消费者将从多个分区中读取。此外,如果您的消费者多于分区,那么一些消费者将处于非活动状态并且根本不会收到任何消息。