如何使用nodejs使用者在kafka中实现并行性?

从理论上讲,既然nodejs是单线程的,那么在定义多个使用者以提高吞吐量时如何实现并行性?

例如,如果我有一个包含4个分区的kafka主题,那么在用户端,当与nodejs一起使用时,如何并行使用4条消息。最多我可以使用singe-threaded事件循环实现并发。

一种可能的解决方案是派生子进程(在这种情况下为3),以使每个进程都可以从特定分区接收消息,前提是系统具有3个空闲核心。但是这种方法有多有效?

实现这一目标的最佳方法是什么?

评论
  • wab
    wab 回复

    在Kafka中,分区是并行度。此外,Kafka群集中的分区越多,可以实现的吞吐量就越高。

    Kafka主题分为多个分区,这些分区可通过在多个代理之间拆分数据来实现并行性。多个分区使多个使用者可以并行读取主题。因此,为了实现并行处理,您需要将主题划分为多个分区。

    为了增加现有主题的分区数量,您可以简单地运行

    bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic topicName --partitions 40
    

    不过,这不会移动现有数据

    关于消费者,消费者群体和分区的说明 如果您有N个分区,则在同一使用者组中最多可以有N个使用者,每个使用者都从一个分区读取。当使用者少于分区时,某些使用者将从多个分区中读取数据。另外,如果您的使用者数量大于分区数量,则某些使用者将处于非活动状态,并且根本不会收到任何消息。

  • ut_sed
    ut_sed 回复

    如果只有一个实例使用带有四个分区的主题,那么该使用者将读取所有分区。

    为了增加吞吐量,您需要有更多的实例(如您建议的那样),但同时请确保所有这些实例都配置了相同的使用者组。

    使用Kafka时,一个分区只能由一个使用者使用,因此拥有更多实例而不是分区是没有意义的。