概述
Artemis使用独特、灵活的寻址模型,其包括三个主要概念:地址,队列和路由类型。
地址:地址代表了一个消息的端点,通过配置地址有全局唯一的名称,一个地址可以绑定0到多个队列,并且绑定一个路由类型。
队列:当消息匹配到对应地址,取决于配置的路由类型消息会被发往一个或者多个队列。队列可以配置为自动创建和删除。
路由类型:路由类型决定如何将消息发送到与地址关联的队列。Artemis可以使用两种不同的路由类型进行配置:
- Anycast(任播):以点对点的方式匹配地址中的单个队列。
- Multicast(广播):以发布-订阅方式匹配地址中的每个队列。
注意:可以为每个地址定义多个路由类型,但是会导致反模式,不建议这样做。如果地址绑定了两种路由类型,并且客户端未指定哪种路由,则代理默认使用任播路由类型。
当客户端使用MQTT协议时,默认路由为多播。
点对点消息
点对点消息指的是生产者发送的消息只有一个消费者(可以进行共享消费),如果多个消费者连接到同一队列,则消息在每个消费者直接平均分配。
可以在$broker-instance/etc/broker.xml里配置地址和其绑定的队列。
注意:对应普通的点对点消息,队列名称必须匹配地址名称:
<addresses>
<address name="orders">
<anycast>
<queue name="orders"/>
</anycast>
</address>
</addresses>
在anycast(任播)模式下,一个地址上可以定义多个队列。当在这样的地址上接收消息时,会在所有定义的队列中均匀分布。如果多个消费者连接到单个队列,Artemis将负责他们直接的分发消息(如上所示):
Artemis通过单地址多队列方式在集群多节点情况下,使用此方式进行集群的负载均衡。配置例子如下:
<addresses>
<address name="address.foo">
<anycast>
<queue name="q1"/>
<queue name="q2"/>
</anycast>
</address>
</addresses>
发布订阅消息
在发布订阅方式中,消息会发送给订阅地址的每个消费者:
配置(multicast)广播路由方式例子:
<addresses>
<address name="pubsub.foo">
<multicast/>
</address>
</addresses>
当消费者连接到广播的地址时,Artemis会自动为客户端创建订阅队列。当然也可以预先配置队列,消费者使用完全限定的队列名称直接连接到它们,但是通常不会去配置其队列:
<addresses>
<address name="pubsub.foo">
<multicast>
<queue name="client123.pubsub.foo"/>
<queue name="client456.pubsub.foo"/>
</multicast>
</address>
</addresses>
同一地址上同时使用点对点和发布-订阅
虽然不推荐,但是可以在同一地址上定义点对点和发布-订阅。对于anycast消息只会发送到对应的anycast队列,同样的multicast消息只会发送到multicast队列。
此方案中的行为取决于所使用协议。对应JMS,topic路由方式与队列和生成的消费者区分明显