多个消费者使用相同完全限定队列名称的问题

问题描述 投票:0回答:1

我有一个地址和一个队列,在

broker.xml
中定义如下:

    <address-settings>
      ...
      <auto-create-queues>false</auto-create-queues>
      <auto-create-addresses>false</auto-create-addresses>
    </address-settings>
    <addresses>
      <address name="news.world">
        <multicast>
          <queue name="america.sport"/>
        </multicast>
      </address>
      ...

我旋转两个消费者(不同的会话/连接)来监听

news.world::america.sport
并向其发送消息。但只有一个消费者收到该消息。

通过自动创建的地址/队列,每个消费者都会获得自己的队列(以 uuid 命名),并且消息似乎被克隆到每个消费者,因此两者都会收到它。我想避免由于存储限制而进行消息克隆,并认为通过使用非自动创建的地址/队列来实现这一点。我想知道为什么单个“硬编码”多播队列实际上表现得像任播队列。

amqp activemq-artemis
1个回答
0
投票

根据您的描述,我认为一切都按设计进行。

由于您有 2 个消费者共享同一个队列(即地址上的

america.sport
news.world
),他们当然会共享相同的消息。换句话说,队列中的消息将分发给一个消费者或另一个消费者,而不是同时分发给两者。这符合队列的基本语义。

队列是多播这一事实并不会改变队列中的消息分发给消费者的方式。多播是一种路由类型,因此仅影响消息从地址路由到队列的方式。

此外,当发送到某个地址的消息被放置在每个多播队列上时,您观察到的消息“克隆”实际上只有很少的开销。您似乎认为每个队列上的消息都是独立存储的,就好像发送到同一地址上的 100 个多播队列的一条消息被存储了 100 次一样。事实并非如此。实际的消息(即正文、标头和属性)仅存储一次,然后每个队列都会获得对该消息的“引用”。为了不浪费资源(即内存或磁盘),该引用的开销故意非常小。如果您有“存储限制”,那么在单个多播队列上使用多个使用者并不是解决它们的方法。

© www.soinside.com 2019 - 2024. All rights reserved.