20.7.4. 群集分组

群集分组遵循相对于普通消息分组的不同途径。在群集里,具有专有组 ID 的消息组可以达到任何节点。对于节点来说,确定哪个组 ID 绑定到哪个节点上的哪个消费者是很重要的。每个节点都负责将消息正确路由至有客户处理这些组 ID 的节点,而不管消息组默认到达什么地方。
这种情况可以用分组处理程序来解决。每个节点有一个分组处理程序,且这个分组处理程序(以及其他处理程序)负责将消息组路由至正确的节点。目前有两种类型的分组处理程序:localremote
Local 处理程序负责决定消息组应该使用的路由。Remote 处理程序与 Local 处理程序通讯并响应地进行工作。每个群集应该选取一个专有节点运行 Local 处理程序,而其他节点则运行 Remote 处理程序。
您可以在服务器配置文件(standalone.xmldomain.xml)里配置 "local" 和 "remote" 组处理程序:
<grouping-handler name="my-grouping-handler">
   <type>LOCAL</type>
   <address>jms</address>
   <timeout>5000</timeout>
</grouping-handler>

<grouping-handler name="my-grouping-handler">
   <type>REMOTE</type>
   <address>jms</address>
   <timeout>5000</timeout>
</grouping-handler>

"timeout" 属性确保路由决定在指定时间内快速完成。如果在这段时间内没有作出决定,异常将被抛出。
最初接收消息组的节点将根据常规的群集路由条件(round-robin 队列可用性)作出路由决定。节点不同的组处理程序将建议这个决定,如果它们接受建议,然后再将这些消息转发到提议的队列。
如果组处理程序拒绝这个建议,节点会建议其他路由。其他节点会遵循套件并将消息组转发到所选的队列。在消息到达队列后,它将锁定队列上的某个客户。