我正在与需要加载大量资源来处理消息内容的消费者合作。同一个家族中的消息需要相同的资源。
我尝试使用消息分组来确保将同一系列中的消息提供给已加载资源的消费者。但是,我希望消费者对同一系列中的消息具有优先权,而不是排他性(加载资源需要时间,处理消息需要更长的时间)。例如,如果消费者 1 和 2 可用,则 ID 为
group1
的消息应始终提供给消费者 1,ID 为 group2
的消息应始终提供给消费者 2。如果只有消费者 2 可用,则它应该消费任何信息。这样,消费者 1 就拥有消息优先权 group1
,但没有排他性。同样,消费者 2 对消息具有优先权 group2
,但不具有排他性。
AMQ 中的消息分组是否有办法不向消费者提供排他性?或者根据内容动态设置消费者优先级的方法?
我正在使用 ActiveMQ“Classic”5.16.2,但如果更适合我可以切换到 Artemis。
在此用例中,我建议过滤消息组。我认为您正在寻求对消息流进行分区,其中消息组提供的“竞争消费者”模式不能满足您的需求。如果您需要由特定消费者处理这些流量,那么您最终希望该消费者拥有一个 HA 备用或并行消费者 - 这将是一个额外的驱动程序来分区或过滤流量。 有两种方法 - 您可以使用虚拟目标(通过带过滤的 CompositeQueue 等)进行服务器驱动的配置,或使用虚拟主题和选择器进行客户端驱动的配置。
这是客户驱动的方法。
发布到虚拟主题(即 topic://VT.ORDER.EVENT)
奖励:您仍然可以让消费者通过注册通配符选择器或直接订阅主题来监控整个流量。
<destinationInterceptors>
<virtualDestinationInterceptor>
<virtualDestinations>
<virtualTopic name="VT.>" prefix="VQ.*." selectorAware="true"/>
</virtualDestinations>
</virtualDestinationInterceptor>
</destinationInterceptors>
保留选择器:
<plugins>
<virtualSelectorCacheBrokerPlugin persistFile="<some path>${activemq.data}/virtual-topic-selectorcache.data" />
</plugins>
参考:虚拟主题
同时接收来自多个组的消息。当群体数量多于消费者数量时就会发生这种情况。 还值得注意的是,你无法控制哪个消费者消费哪个组。分组的要点在于 one 消费者从组中获取消息,而不是
whichone。 消费者优先级由消费者自己设置,如文档所述。它不是基于正在发送的消息的内容。
您可以尝试在消息上设置一个属性来反映它们所在的“家庭”,然后您的消费者可以使用选择器来消费他们关心的消息。 请记住,您的客户端应用程序中始终可以有多个使用者。每个客户端可能有两个消费者 - 一个带有选择器的高优先级消费者,然后是一个没有选择器的低优先级消费者。代理会优先考虑带有选择器的消费者,但如果没有匹配,它会将消息分派给没有选择器的消费者。