activemq高并发与负载均衡解决

高并发:

 当一个应用被部署于生产环境,灾备计划是非常重要的,以便从网络故障,硬件故障,软件故障或者电源故障中恢复。通过合理的配置ActiveMQ,可以解决上诉问题。最典型的配置方法是运行多个Broker,一旦某台机器或者某个broker失效,其他broker能够顶上去。这种方式叫做Master/Slave,一个broker作为Master提供服务,而其他broker则作为slave等待master失效从而顶上。客户端需使用failover transport方式来连接broker。

1,master-slave模式之Share File System Master

activemq.xml配置文件:

  <persistenceAdapter>  

          <kahaDB directory="${activemq.data}/kahadb"/>  

  </persistenceAdapter>  

客户端在连接时,使用failover:

ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("failover:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61617)");  

 

负载均衡:

Broker-Cluster部署方式中,各个broker通过网络互相连接并共享queue。这在一定程度上可视为负载均衡的一种方法。有两种实现方式:静态发现和动态发现。

 将ActiveMq拷贝2份,并将example下conf下的activemq-static-network-broker1.xml, activemq-static-network-broker2.xml分别替换在\bin\win64 (32)下的activemq.xml(名字改为activemq.xml)

静态发现,主要在其中一个配置文件中增加:

<networkConnectors>

          <networkConnector  uri="static:(tcp://localhost:61618)"/>

</networkConnectors>

通过以上配置这两个 broker通过网络互相连接,并共享queue,

测试代码:

//Broker1消息接收:

// init connection factory with activemq  初始化

               QueueConnectionFactory factoryA = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616"); 

               // specify the destination  指定一个目标地址

               Queue queueB = new ActiveMQQueue("queue "); 

               // create connection,session,consumer and receive message 创建连接 session ,顾客 ,接收消息

               QueueConnection connA = factoryA.createQueueConnection(); 

               connA.start(); 

                
               // first receiver on broker1    代理1的第一个接收者

               QueueSession sessionA1 = connA.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 

               QueueReceiver receiverA1 = sessionA1.createReceiver(queueB); 

               final AtomicInteger aint1 = new AtomicInteger(0); 

               MessageListener listenerA1 = new MessageListener(){ 

                   public void onMessage(Message message) { 

                       try { 

                           System.out.println(aint1.incrementAndGet()+" => first receiver A1 receive from kk.b: " + ((TextMessage)message).getText()); 

                       } catch (JMSException e) { 

                           e.printStackTrace(); 

                       } 

                   }}; 

               receiverA1.setMessageListener(listenerA1 ); 

               
               // second receiver on broker1   第二个接收者

               QueueSession sessionA2 = connA.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 

               QueueReceiver receiverA2 = sessionA2.createReceiver(queueB); 

               final AtomicInteger aint2 = new AtomicInteger(0); 

               MessageListener listenerA2 = new MessageListener(){ 

                   public void onMessage(Message message) { 

                       try { 

                           System.out.println(aint2.incrementAndGet()+" => second receiver A2 receive from kk.b: " + ((TextMessage)message).getText()); 

                       } catch (JMSException e) { 

                           e.printStackTrace(); 

                       } 

                   }}; 

               receiverA2.setMessageListener(listenerA2 ); 

                

         
//Broker2消息生产及接收:

QueueConnectionFactory factoryB = new ActiveMQConnectionFactory("tcp://127.0.0.1:61618"); 

                Queue queueB1 = new ActiveMQQueue("queue"); 

                QueueConnection connB = factoryB.createQueueConnection(); 

                connB.start(); 

                // receiver on broker2 

                QueueSession sessionB1 = connB.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 

                QueueReceiver receiverB1 = sessionB1.createReceiver(queueB1); 

                final AtomicInteger bint1 = new AtomicInteger(0); 

                MessageListener listenerB1 = new MessageListener(){ 

                    public void onMessage(Message message) { 

                        try { 

                            System.out.println(bint1.incrementAndGet()+" => first receiver B1 receive from kk.a: " + ((TextMessage)message).getText()); 

                        } catch (JMSException e) { 

                            e.printStackTrace(); 

                        } 

                    }}; 

                    receiverB1.setMessageListener(listenerB1 ); 

                 

                // producer  on broker2   生产者broker2 ,broker1 并不是生产者

                QueueSession sessionBp = connB.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 

                MessageProducer producer = sessionBp.createProducer(queueB1); 

                int index = 0; 

                while(index++<300){ 

                    TextMessage message = sessionBp.createTextMessage(index + " ****from kk.b on broker2"); 

                    producer.send(message); 

                }

 

 

 

转载于:https://my.oschina.net/WWWW23223/blog/829745

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值