Apache Pulsar-ioThreads / listenerThreads和消息排序

时间:2019-07-09 14:24:35

标签: apache-pulsar

我们正在开发一个应用程序,要求严格按照顺序处理具有相同密钥的消息。另外,出于性能/吞吐量的原因,我们需要引入并行处理。

并行化很容易-我们可以有一个线程来接收消息,在键上计算哈希,并使用hash%的worker数将消息分发到另一端有一个worker的特定阻塞队列。这样可以确保将具有相同密钥的消息分派给相同的工作程序,因此可以保证排序-只要接收者按顺序获得消息即可。

问题是:

  1. 增加ioThreads和listenerThreads(默认= 1)是否会对性能产生影响,也就是说,我们应该期望看到更多的消息通过还是I / O始终是限制因素?

  2. 如果我们增加它们,我们是否仍可以保证订购?

Pulsar文档尚不清楚...

2 个答案:

答案 0 :(得分:1)

  

增加ioThreads和listenerThreads(默认= 1)是否会对性能产生影响,即我们是否应该期望看到更多的消息通过,或者I / O始终是限制因素?

可能取决于各种因素。

  1. IoThreads:这是用于管理与代理之间的TCP连接的线程池。如果您在多个主题之间进行生产/消费,则很可能与多个代理进行交互,因此打开了多个TCP连接。 ioThreads数量的增加可能会消除“单线程瓶颈”,尽管只有在确实存在这种瓶颈的情况下才有效(大多数情况下不会这样)。您可以检查所有线程中使用者进程中的CPU使用率,以查看是否有任何线程接近100%(单个CPU内核)。

  2. ListenerThreads:这是在使用者中使用消息侦听器时的线程池大小。通常,这是应用程序用来处理消息的线程池(除非它跳到另一个线程)。如果应用程序处理达到1个CPU核心限制,则在此处增加线程数可能是有意义的。

  

如果我们增加它们,是否仍可以保证订购?

是的。

  • IO线程:1个TCP连接始终映射到1个IO线程
  • ListenerThreads:1个使用者被分配给1个侦听器线程

答案 1 :(得分:1)

您可能还想看看使用Pulsar 2.4中引入的新的密钥共享订阅类型。根据{{​​3}}

  

消息在各个使用者之间进行分发,并且具有相同密钥或相同订购密钥的消息仅传递给一个使用者。