1

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

并行化很容易——我们可以让单个线程接收消息,计算密钥的哈希值,并使用哈希 % 的工作人员将消息分发到特定的阻塞队列,另一侧有工作人员。这保证了具有相同密钥的消息被分派给同一个工作人员,因此保证了排序 - 只要接收者按顺序获取消息。

问题是:

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

  2. 如果我们增加它们,我们仍然保证订购吗?

Pulsar 文档不清楚...

4

2 回答 2

2

增加 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 个监听线程
于 2019-07-10T17:50:38.277 回答
1

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

消息在消费者之间分发,具有相同密钥或相同排序密钥的消息仅传递给一个消费者。

于 2019-09-17T18:20:20.187 回答