在一个由多台提供消息服务的 AMQ 服务器组成的网络上,每个提供消息服务的 AMQ 服务器 可被视为一个网络中的节点,消息路由意味着节点之间的路径。只要用户连接到网络中任何一个节点,即可向网络中的其他任意节点发送消息,由消息服务根据消息路由提供消息在网络中的最佳传输机制。
A、B、C、D、E 五个节点上都是提供消息服务的 AMQ ,五个节点连通成一个网络,连接到 A 节点的客户端可以发消息到五个节点中的任意一个节点,AMQ 会自动寻找一条最佳路径传递消息到目标节点。如从A 发消息到D,有两条连通路径:A->B->C->D 和A->E->D,其中 A->E->D 经过的节点最少,该路径为最佳路径, AMQ 将根据此路径对消息进行传递。
在一个 AMQ 网络中,如上图所示,每个节点都是一个消息路由器(Router),每个消息路由器有一个路由器名,以区别于其他的路由器。路由器名可以和主机名相同, 也可以不同。
每两个节点之间的直接路径被称为路由连接器(RoutingConnector),网络中每两个节点间的直接路径必须事先进行申明性的定义。每个路由连接器的申明都是双向的,如在A节点上申明到B的路由连接器,则说明从A节点到B节点之间是双向连通的,从A可以到达B,从B也同样能够到达A。
假设上图中的五个节点A、B、C、D、E 是某个实际网络中五个提供消息服务的 AMQ ,实际网络中的主机名分别是computerA、computerB、 computerC、computerD、computerE,在由这五个节点组成的 AMQ 网络中,服务器配置的本MQ的路由器名分别是routerA、routerB、routerC、routerD、routerE,要使这五个节点结形成类似于上图的 AMQ 网络,即每个节点都有一条与下一个节点双向连通的路径,最后一个节点有一条与最开始的节点双向连通的路径,形成一个闭合的环,消息客户连接到环中的任意节点,都可向其他节点发送消息。则可以选择在每个节点上都申明一个到下一个节点的连接器,由于连接器是双向连通的,所以在下一个节点不需要申明一个到上一个节点的连接器。同时在每个节点上的远程路由需要申明跟它直接相连的其它节点的路由名。如:A节点上的远程路由需要申明B、E两个节点,表示由A节点可以直接连接到B、E两个节点上,并且不需要申明其它节点,这样A就能够向所有的节点发送消息了。同时需要申明由A到B的连接器,表示A节点跟B节点有一条双向连通的路径;节点B的远程路由则需要申明A、C两个节点,同时需要申明由B到C的连接器,如此类推。
如消息路由图5中,如节点B未申明到节点C的连接器,消息客户连接到了节点A,发送消息到节点C,这时MQ会自动选择另外一条通往C的路径(即是A到E到D到C)进行发送。假如同时节点C也未申明到节点D的连接器,假如客户此时向C发送消息,由于此时无有效的由A到C的路径,则消息将会被保存在网络中,等待当有有效的路径时再行发送。
对路由的配置是通过 AMQ 安装 目录中,子目录config下的mq.conf配置文件进行的。通过mq.conf中的相关配置段可以对消息路由器和路由连接器进行管理和配置。
路由器的配置
消息路由器的配置通过在mq.conf文件中配置消息服务的服务配置段进行,其缺省配置段如下:
...
<SERVICE
CLASS="com.apusic.jms.server.JMSServer">
</SERVICE>
...
通过对申明此服务的XML元素增加名为RemoteRouters的ATTRIBUTE子元素,在其值中列出相应的路由器名即可。以消息路由图示-2中的A节点为例,A节点上需要申明B、E两个节点,表示由A节点可以直接连接到B、E两个节点上,并且可以作为消息路由路径中的一个中转节点,则可以进行如下配置:
...
<SERVICE
CLASS="com.apusic.jms.server.JMSServer">
<ATTRIBUTE NAME="RemoteRouters" VALUE="computerB,computerE"/>
</SERVICE>
...
其它B、C、D、E节点上的相关配置段如此类推进行配置。路由器名字间使用逗号分隔,路由器名字可以是其他主机的主机名。
一般,路由器的名字默认是服务器的主机名,但是,也可以通过使用对申明此服务的XML元素增加名为RouterName的ATTRIBUTE子元素,在其值中指定自身的路由器名。如上例中采用了主机名对路由连接器进行申明,如在五个节点上都申明了路由器名字,如A、B、C、D、E主机分别对应routerA、routerB、routerC、routerD、routerE,则上例中主机A的配置如下:
...
<SERVICE
CLASS="com.apusic.jms.server.JMSServer">
<ATTRIBUTE NAME="RouterName" VALUE="routerA"/>
<ATTRIBUTE NAME="RemoteRouters" VALUE="routerB,routerE"/>
</SERVICE>
...
其它路由器的配置依次类推。
路由连接器的配置
每个JMS网络中的消息路由器都是通过路由连接器进行连接的,每个路由器可以拥有多个路由连接器连接到其它节点,申明到其它节点的路由连接器是双向连通的,例如在A节点上申明了到B节点的路由连接器,则B节点也同时连接到了A节点,不需要在B节点上面重新申明一次到A节点的路由连接器。对路由连接器的配置是通过在mq.conf配置文件中增加路由连接器服务实现的。以消息路由图示-2中的A节点为例,需要申明到节点B的路由连接器,则可在mq.conf文件中加入如下配置段:
...
<SERVICE
CLASS="com.apusic.jms.routing.RoutingConnector" NAME="Connector:Name=toB">
<ATTRIBUTE NAME="RemoteHost" VALUE="computerB"/>
<ATTRIBUTE NAME="RemotePort" VALUE="4888"/>
</SERVICE>
...
其中RemoteHost属性的值是B的主机名或者IP地址,toB是此路由连接器区别于其他路由连接器的自由定义名字,RemotePort属性的值是B主机上要连接的 AMQ 服务器的端口。具体使用中,可将其更改为实际的路由连接器名、主机名与端口。
消息路由图示-2中其它节点上的路由连接器配置如此类推。
如果JMS网络中的节点之间需要SSL安全通信,需要如下的安全配置。 即增加属性SSLEnabled、TrustStore、TrustStorePassword的配置
...
<SERVICE
CLASS="com.apusic.jms.routing.RoutingConnector" NAME="Connector:Name=toB">
<ATTRIBUTE NAME="RemoteHost" VALUE="computerB"/>
<ATTRIBUTE NAME="RemotePort" VALUE="4889"/>
<ATTRIBUTE NAME="SSLEnabled" VALUE="TRUE"/>
<ATTRIBUTE NAME="TrustStore" VALUE="config/clientkeystore.jks"/>
<ATTRIBUTE NAME="TrustStorePassword" VALUE="WT.1234"/>
<ATTRIBUTE NAME="PingTimeOut " VALUE="60000"/>
<ATTRIBUTE NAME="RoutingTimeOut" VALUE="120000"/>
</SERVICE>其中PingTimeOut属性是在心跳方式检查网络的状态时设置等待心跳应答的超时时间,以毫秒计。值必须大于500。出厂值为60000。
RoutingTimeOut属性是建立路由应答的超时时间,以毫秒计。值必须大于1000。出厂值为120000。