我们正在开发一个应用程序,要求严格按照顺序处理具有相同密钥的消息。另外,出于性能/吞吐量的原因,我们需要引入并行处理。
并行化很容易-我们可以有一个线程来接收消息,在键上计算哈希,并使用hash%的worker数将消息分发到另一端有一个worker的特定阻塞队列。这样可以确保将具有相同密钥的消息分派给相同的工作程序,因此可以保证排序-只要接收者按顺序获得消息即可。
问题是:
增加ioThreads和listenerThreads(默认= 1)是否会对性能产生影响,也就是说,我们应该期望看到更多的消息通过还是I / O始终是限制因素?
如果我们增加它们,我们是否仍可以保证订购?
Pulsar文档尚不清楚...
答案 0 :(得分:1)
增加ioThreads和listenerThreads(默认= 1)是否会对性能产生影响,即我们是否应该期望看到更多的消息通过,或者I / O始终是限制因素?
可能取决于各种因素。
IoThreads:这是用于管理与代理之间的TCP连接的线程池。如果您在多个主题之间进行生产/消费,则很可能与多个代理进行交互,因此打开了多个TCP连接。 ioThreads数量的增加可能会消除“单线程瓶颈”,尽管只有在确实存在这种瓶颈的情况下才有效(大多数情况下不会这样)。您可以检查所有线程中使用者进程中的CPU使用率,以查看是否有任何线程接近100%(单个CPU内核)。
ListenerThreads:这是在使用者中使用消息侦听器时的线程池大小。通常,这是应用程序用来处理消息的线程池(除非它跳到另一个线程)。如果应用程序处理达到1个CPU核心限制,则在此处增加线程数可能是有意义的。
如果我们增加它们,是否仍可以保证订购?
是的。
答案 1 :(得分:1)
您可能还想看看使用Pulsar 2.4中引入的新的密钥共享订阅类型。根据{{3}}
消息在各个使用者之间进行分发,并且具有相同密钥或相同订购密钥的消息仅传递给一个使用者。