我对 activemq 相对较新,我尝试做的第一件事就是从服务器进程发布到 5,000 个主题(每个股票一个主题)。服务器和经纪人设法跟上。
然而,在消费者方面,它非常奇怪。如果我使用一个通配符使用者(“mytopic.>”)订阅所有 5k 个主题,一切都会保持正常。但是,如果我尝试为每个主题订阅一个消费者,性能就会下降并且无法跟上。
我尝试过使用预取限制和优化的确认模式,似乎没有任何帮助。
知道为什么单个通配符能够在 5k 个单独的主题中表现不佳吗?我也可以自己解复用消息,但希望 activemq 能够尽可能高效地为我做这件事。
编辑:有关此的更多信息和更新:
- 我在每秒发布一次的 ~ 6,000 个主题上对此进行测试
- 我正在使用 activemq-cpp c++ 库,并且正在为所有主题创建 1 个会话。事实证明,activemq 实现非常低效,它在向会话传递消息时对每条消息的所有主题进行线性扫描(实际上是两次)。
- 更糟糕的是,如果您为每个主题创建一个会话,它会尝试为每个会话创建一个线程,以便很快爆发。
- 可是等等!连接上有一个选项 setAlwaysSessionAsync,因此会话不会创建自己的线程,太棒了!
- 哦!不是那么快,会话仍然会在非异步模式下创建一些 RW 互斥体,并且它们使用一些本土 TLS 数据,这些数据的硬编码限制为每个线程约 300 个实例......呃
- 好的,所以我不得不将我可以创建的会话数限制为 ~ 150(我猜其他对象也在使用 TLS 数据),然后在这些主题上循环我的主题......
- 如果我能控制多少线程可以处理数据外线会很好,但可惜那也没有暴露出来……呃,在activemq-cpp代码中硬编码
TLDR;activemq 是一堆乱七八糟的便便