构造SUN Message Queue集群,提供高可用性消息服务

 

本文转自:JAVA技术

作者:Carol Zhang, Sun Microsystems

本文将介绍SUN提供的基于JMS的企业级产品SUN Java System Message Queue,并重点讲解怎样构造SUN Message Queue的集群,为企业级的应用提供高可用性和高扩展性的消息服务。


Message Queue

Message Queue适合于在分布式企业应用之中实现可靠的异步消息通信。JMS是基于JAVA的实现消息通信的开放标准,是用JAVA实现的“消息中间件”。
 

Sun Java System Message Queue

Sun Java System Message Queue 提供功能全面的消息服务,符合 Java Messaging Specification (JMS) 1.1 规范的的可靠、异步的消息传送功能。此外,Message Queue 还提供 JMS 规范之外的许多功能,以满足大型企业部署的需要。
目前最新的版本是Sun Java™ System Message Queue 3 2005Q4 (3.6 SP3),支持Solaris,Linux和Windows平台。SUN Message Queue可以免费的下载和使用。
 

Message Queue Cluster

在大型企业部署的应用中下,系统必须提供高可用性和可扩展性。这往往是通过服务器的集群实现。Sun Message Queue支持Broker Cluster,即一组broker,作为一个逻辑的整体,给客户提供消息传送服务。Cluster通过在多个broker之间均衡分布来自客户端的连接,从而达到负载均衡的目的。在系统需要处理大量的消息,有可能超过单个broker的负荷时,MQ Cluster是很好的选择。
下图是Sun Message Queue Cluster的原理图:



从图中可以看出:
 

  1. 多个Broker实例之间组成集群,其中有,且只有一个Master Broker,它维护着“Configuration Change Record”,记录了Destination 和durable subscription,这些记录被其它的Broker 用来恢复其失效期间发生的变化。
  2. Broker之间的同步:在Broker的环境中,Broker之间要同步“destination”,“Message Consumer”的信息。
  3. 每个Client端都直接连接着一个Broker,我们称之为“Home Broker”。“Home Broker”负责本地连接的client(包括producer和consumer)的操作,以及与remote broker之间的消息传送。
  4. 可以推论出,Broker之间的traffic可能是非常多的。它们包括Broker之间的同步,为连接在remote broker上的consumer传送消息等。Sun MQ为最小化这些网络traffic做了很多优化,以减小网络开销。

创建Sun Message Queue Cluster

Mq的缺省安装的实例使用7676端口。本示例中描述了在Solaris环境下,怎样创建由缺省实例作为Master,和在本机不同端口运行的MQ实例组成的集群。类似的步骤可以运用于其它的分布式环境。

1. 在本机的不同端口创建另外一个MQ实例

  1. 在目录/var/imq/instances下 创建实例目录, 例如. “imqbroker_1”
  2. 编辑 /var/imq/instances/<instance>/props/config.properties file, 使imq.cluster.url 属性指向将在第三步创建的集群属性文件所在的路径,例如:imq.cluster.url=file:/export/home/config/mq/cluster.properties
  3. 选择一个未被使用的端口,赋值于imq.portmapper.port属性,例如:imq.portmapper.port=7686
     

2. 创建集群属性文件
 

imq.cluster.brokerlist=localhost:7676,localhost:7686
imq.cluster.masterbroker=localhost:7676
imq.cluster.url=file:/export/home/config/mq/cluster.properties
imq.cluster.transport=tcp

将这个文件保存在 imq.cluster.url 指向的路径


3. 启动实例:imqbrokerd –name <instance>, 例如:
 

imqbrokerd -name imqbroker &
imqbrokerd -name imqbroker_1 &

 

4. 如果需要关闭实例,使用:imqcmd shutdown bkr -b <host>:<port> 例如:
 

imqcmd shutdown bkr -b localhost:7676
 

5. 测试集群
 

启动管理控制台,观察两个broker的destination的同步情况。
命令行运行 #imqadmin



如上图所示,管理控制台建立了跟两个broker的连接,这两个broker已经组成了cluster。当用户在其中一个broker上建立一个 destination的时候,可以发现这个destination能同步到另外一个broker上去,这就说明cluster创建成功了。
 

开发客户端


本节描述对于SUN Mq的Cluster,客户端的编程如何利用到Cluster实现负载均衡。客户端编程要点是,用于创建与Broker连接的“连接工厂”对象必须用Broker的地址列表初始化。有两种方式得到“连接工厂”对象:
 

1.使用JNDI查询
 

我们以在SUN Java System Application Server 8.1中添加工厂对象为例,将QueueConnectionFactory 对象绑定到jndi tree,并在属性编辑列表中添加属性“AddressList”,其值为 “mq://localhost:7676/, mq://localhost:7686/”. 

2.直接实例化工厂对象
 

import com.sun.messaging.*;
myQConnFactory = new com.sun.messaging.QueueConnectionFactory();
myQConnFactory.setProperty(ConnectionConfiguration.imqAddressList, "localhost:7676,localhost:7686");
myQConnFactory.setProperty(ConnectionConfiguration.imqAddressListBehavior, "RANDOM");


当编译运行时,将imqlibjms.jar, imqlibimq.jar 加入到classpath。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值