更好地按主题名称或字符串 属性 过滤 JMS 消息?

Better to filter JMS message by topic name or String Property?

在使用 Apache ActiveMQ Artemis 时,是首选具有用于区分它们的 String 属性的一个主题还是多个主题?例如,发布商是否应该这样做:

jmsTemplate.convertAndSend("quotes", quote, m -> {
   m.setStringProperty("symbol", "MSFT");
   return m;
});

还是这个?

jmsTemplate.convertAndSend("quotes.MSFT", quote, m -> {
   m.setStringProperty("symbol", "MSFT");
   return m;
});

请注意,我不能只做:

jmsTemplate.convertAndSend("quotes.MSFT", quote);

因为我需要符号 属性 作为 default-last-value-key:

<address-setting match="quote.#">
  <retroactive-message-count>100000</retroactive-message-count>
  <default-last-value-key>symbol</default-last-value-key>
  <default-non-destructive>true</default-non-destructive>

可能有 100,000 个符号。创建这么多 pub/sub 个主题会很糟糕吗?

大多数将没有订阅者,但会使用追溯地址保留最后一个值。我将在 Java 和 Python (STOMP) 中拥有消费者。

一般来说,ActiveMQ Artemis 并没有什么内在的东西必然会推动你这样或那样。

但是,您的 use-case 与 retroactive-address + LVQ 配置相当独特。我在这里使用单个地址的担心是,如果真的有 100,000 个符号并且每个符号的最后一个值应该保留,那么支持追溯地址的 ring-queue 可能需要 100,000 条消息深度,这意味着每次在该地址上创建一个订阅队列,然后代理将必须处理所有这些消息。我预计这将给经纪人带来沉重负担。

因此,在这一点上我认为每个符号的地址可能是最好的。那么 retroactive-message-count 可以是 1.

最终,我最好的建议是使用 production-like 负载实际测试这两种不同的配置,然后选择在性能、可管理性等方面最适合您的 use-case 的配置。魔鬼总是在这种事情的细节中。在这样的背景下,有太多动人的部分和未说出口的要求,无法提供权威的建议。