1.6 集群的JMS服务
JBoss AS 3.2.4 和更高的版本支持高可用性的 all 服务器配置里的 JMS(HA-JMS)服务。在 JBoss AS 当前的发布版本里,HA-JMS 服务用一个群集的 singleton fail-over 服务来实现。
注意
如果你希望自己来配置 HA-JMS,你可以在以前的 JBoss AS 版本里让它运行。我们有一个客户成功地在 JBoss AS 3.0.7 里使用 HA-JMS。如果你有更多问题的话,请联系 JBoss 支持部门。
如果你希望自己来配置 HA-JMS,你可以在以前的 JBoss AS 版本里让它运行。我们有一个客户成功地在 JBoss AS 3.0.7 里使用 HA-JMS。如果你有更多问题的话,请联系 JBoss 支持部门。
1.6.1 高可用性的Singleton Fail-over
JBoss HA-JMS
服务(也就是消息队列和主题)任何给定时间都只在群集里的单节点运行(主节点)。如果这个节点崩溃了,群集系统简单地选取另外一节点来运行
JMS
服务(
fail-over
)。这种设置提供了针对服务器瘫痪的冗余措施,但并没有降低
JMS
服务器节点的负载。
注意
虽然你不能够对 HA-JMS 队列进行负载平衡(只有一个运行这个队列的主节点),但是你可以平衡处理队列里信息的 MDBs 的负载(参考章节 6.1.3, “负载均衡的HA-JMS MDBs”).
虽然你不能够对 HA-JMS 队列进行负载平衡(只有一个运行这个队列的主节点),但是你可以平衡处理队列里信息的 MDBs 的负载(参考章节 6.1.3, “负载均衡的HA-JMS MDBs”).
1.6.1.1 服务器端配置
为了使用
singleton fail-over HA-JMS
服务,你必须在群集里的所有节点上配置相同的
JMS
服务。这包括所有和
JMS
相关的
MBeans
以及部署的
JMS
应用程序。
JMS
服务器被设置成在
DefaultDS
里持久化它的数据。在缺省的情况下,那就是内含的
HSQLDB
。然而,在大部分群集环境里,所有节点都需要把数据持久化到一个共享数据库里。因此,在你启动群集
JMS
之前要做的第一件事就是建立一个共享数据库。你需要做如下的事情:
•
配置
DefaultDS
来指向你选择的数据库服务器。就是用
docs/examples/jca
目录下的
xxx-ds.xml
文件代替
deploy/hsqlsb-ds.xml
文件,其中
xxx
是目标共享数据库的名字(例如,
mysql-ds.xml
)。
•
把
server/all/deploy-hasingleton/jms
目录下的
hsqldb-jdbc2-service.xml
文件用特定数据库的文件代替。例如,
MySQL
的文件就是
mysql-jdbc2-service.xml
。
JBoss AS
发行版本捆绑了一些
RDBMS
的配置文件。它们可以在
docs/examples/jms
下找到。
注意
你不需要替换server/all/deploy-hasingleton/jms 目录下的hsqldb-jdbc-state-service.xml 文件。尽管它的名字里包含 hsql,它适用于所有兼容 SQL92 的数据库,包括 HSQL,MySQL,SQL Server 和更多数据库。象我们上面配置的那样,它自动使用 DefaultDS 来存放数据。
虽然你不能够对 HA-JMS 队列进行负载平衡(只有一个运行这个队列的主节点),但是你可以平衡处理队列里信息的 MDBs 的负载(参考章节 6.1.3, “负载均衡的HA-JMS MDBs”).
你不需要替换server/all/deploy-hasingleton/jms 目录下的hsqldb-jdbc-state-service.xml 文件。尽管它的名字里包含 hsql,它适用于所有兼容 SQL92 的数据库,包括 HSQL,MySQL,SQL Server 和更多数据库。象我们上面配置的那样,它自动使用 DefaultDS 来存放数据。
虽然你不能够对 HA-JMS 队列进行负载平衡(只有一个运行这个队列的主节点),但是你可以平衡处理队列里信息的 MDBs 的负载(参考章节 6.1.3, “负载均衡的HA-JMS MDBs”).
1.6.1.2 HA-JMS客户端
客户和常规的
JMS
客户在两个方面有所不同。
.
•
The HA-JMS
客户必须获得
HA-JNDI
里的
JMS connection factories
(缺省端口是
1100
)。
•
客户连接必须监控服务器异常(
exceptions
)。当群集系统
fail-over
到另外一个主节点时,所有在当前连接上的的客户端操作都会失败并产生异常(
exceptions
)。客户端必须知道该重新连接。
注意
虽然 HA-JMS 连接工厂(connection factory)知道运行 JMS 服务的当前主节点,但并不存在智能的客户端拦截器(client side interceptor)。客户端 stub 只知道固定的主节点,它不能够依服务器拓扑结构的变化而调整。
虽然 HA-JMS 连接工厂(connection factory)知道运行 JMS 服务的当前主节点,但并不存在智能的客户端拦截器(client side interceptor)。客户端 stub 只知道固定的主节点,它不能够依服务器拓扑结构的变化而调整。
1.6.1.3 负载平衡的HA-JMS MDBs
虽然
HA-JMS
队列(
queues
)和主题(
topics
)在同一时间只在单节点上运行,但其他节点上的
MDBs
也能够接收和处理
HA-JMS
主节点上的信息。这种竞争的情况导致
MDBs
的平衡负载行为。为了启用
MDBs
的平衡负载,你可以指定队列的
receiver
。这个
receiver
记录哪个节点正在等待信息和信息该按什么样的顺序来处理。
JBoss
提供三个
receiver
的实现(
implementations
)。
•
The org.jboss.mq.server.ReceiversImpl
是
HashSet
的缺省实现(
implementation
)。
•
The org.jboss.mq.server.ReceiversImplArrayList
是
ArrayList
的实现。
•
The org.jboss.mq.server.ReceiversImplLinkedList
是
LinkedList
的实现。
你可以指定
receiver
实现的类名作为在每个节点上定义永久
JMS Queue
或
DestinationManager
的
MBean
的一个属性。为了获得最好的负载平衡性能,我们建议你使用
ReceiversImplArrayList
或
ReceiversImplArrayList
实现,因为
JVM
里的
HashSet
的实现不是很好。
本文转自xudayu 51CTO博客,原文链接:http://blog.51cto.com/xudayu/68585,如需转载请自行联系原作者