天天看點

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡

ActiveMQ叢集搭建好之後,接下來就該測試一下了。

一、先安裝Zookeeper 的eclipse插件吧。

1. 打開 eclipse, Help -》 Install New Software,點選Add,添加位址: http://www.massedynamic.org/eclipse/updates/

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡

2. 點選OK,勾選Zookeeper插件,另外兩個貌似沒用

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡

3. 安裝完之後,點選Window-》Show View-》Other,選擇安裝的Zookeeper插件

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡

4. 出現Zookeeper控制台後,點選右上角的按鈕,增加Zookeeper節點。

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡

出現界面

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡

點選Add

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡

添加你的Zookeeper IP,Finish

5. 檢視叢集資訊。

如果你的Zookeeper+ActiveMQ開啟的話,會出現

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡

二、代碼

一個簡單的生産者:

package mq.cluster;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

public class Sender {

    
    public static void main(String[] args) throws Exception {
        
        //1. 建立一個ConnectionFactory. 預設tcp://0.0.0.0:61616
        String userName = ActiveMQConnectionFactory.DEFAULT_USER;
        String password = ActiveMQConnectionFactory.DEFAULT_PASSWORD;
        String brokerURL = "failover:(tcp://192.168.127.129:61616,tcp://192.168.127.130:61616,tcp://192.168.127.131:61616)?Randomize=false";
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(userName, password, brokerURL);
        
        //2. 通過ConnectionFactory建立一個Connection連接配接,并且調用start方法開啟
        Connection connection = connectionFactory.createConnection();
        connection.start();
        
        //3. 通過Connection建立Session,用于接收消息[第一個參數:是否啟用事務;第二個參數:設定簽收模式]
//        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);//手工簽收--常用
        
        //4. 通過Session建立Destination對象
        Destination destination = session.createQueue("foodQueue");
        
        //5. 通過Session建立發送或接受對象
        MessageProducer messageProducer = session.createProducer(null);
        
        //7. 使用JMS規範裡面消息類型之一 TextMessage 來建立資料,用MessageProducer來發送
        for (int i = 1; i < 500; i++) {
            TextMessage message = session.createTextMessage();
            message.setText("大蘿蔔" + i);
            //參數:目标,消息,傳遞資料的模式,優先級,消息的過期時間
            messageProducer.send(destination, message, DeliveryMode.NON_PERSISTENT, 0, 1000*60);
            //System.out.println("生産者:" + message.getText());
            Thread.sleep(1000);
        }
        
        //使用事務要手動送出
        //session.commit();
        
        //8. 關閉連接配接
        connection.close();
        
    }// main
}      

因為是叢集,是以brokerUrl要與衆不同,

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡
String brokerURL = "failover:(tcp://192.168.127.129:61616,tcp://192.168.127.130:61616,tcp://192.168.127.131:61616)?Randomize=false";      

一個簡單的消費者:

package mq.cluster;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

public class Receiver {

public static void main(String[] args) throws Exception {
        
        //1. 建立一個ConnectionFactory. tcp://0.0.0.0:61616
        String userName = ActiveMQConnectionFactory.DEFAULT_USER;
        String password = ActiveMQConnectionFactory.DEFAULT_PASSWORD;
        String brokerURL = "failover:(tcp://192.168.127.129:61616,tcp://192.168.127.130:61616,tcp://192.168.127.131:61616)?Randomize=false";
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(userName, password, brokerURL);
        
        //2. 通過ConnectionFactory建立一個Connection連接配接,并且調用start方法開啟
        Connection connection = connectionFactory.createConnection();
        connection.start();
        
        //3. 通過Connection建立Session,用于接收消息[第一個參數:是否啟用事務;第二個參數:設定簽收模式]
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        
        //4. 通過Session建立Destination對象
        Destination destination = session.createQueue("foodQueue");
        
        //5. 通過Session建立發送或接受對象
        MessageConsumer messageConsumer = session.createConsumer(destination);
        
        //7. 使用JMS規範裡面消息類型之一 TextMessage 來建立資料
        while (true) {
            TextMessage message = (TextMessage) messageConsumer.receive();
            if(message == null) break;
            System.out.println("消費者:" + message.getText());
        }
        
        //8. 關閉連接配接
        connection.close();
        
    }// main
}      

先開啟消費者,讓它先阻塞,準備吃飯。然後開啟生産者:

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡

浏覽器打開提供服務的MQ控制台

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡

一切正常

三、關于負載均衡

畫個圖先~僅供參考【這部分真的僅供參考啊!!别噴我,但是可以告訴我怎樣是對的

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡

,希望大家指正】

目前的架構:

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡

負載均衡方案:=========================================

ActiveMQ叢集簡單測試+eclipse Zookeeper 插件 + 負載均衡

第二種方案呢,假設我們整個應用是個食堂,這個食堂裡面有好多飯口,每個飯口有好多大爺大媽(咦~~~)。每個飯口實作了高可用,即使有大媽不上班,還有大爺頂上。針對好多學生(使用者),實作了負載均衡,學生被基本均勻的配置設定到每一個飯口上。

食堂----應用

飯口----叢集

大媽----伺服器

==================================

現在我們利用Broker-Cluster 可以解實作負載均衡。配置的方法就是:

打開activemq.xml檔案,在persistenceAdapter的前面加上

<

networkConnectors

>

<

networkConnector

uri

=

"static:(tcp://host1:61616,tcp://host2:61616,tcp://..)" duplex="false"

/>

</

networkConnectors

>

就拿這兩個叢集來說:

叢集1 >>>>>>>>連結>>>>>>>> 叢集2:192.168.127.1,192.168.127.2,192.168.127.3 加上

<networkConnectors>
  <networkConnector uri="static:(tcp://192.168.127.4:61616,tcp://192.168.127.5:61616,tcp://192.168.127.6:61616)" duplex="false"/>
</networkConnectors>      

叢集2 >>>>>>>>連結>>>>>>>> 叢集1: 192.168.127.4,192.168.127.5,192.168.127.6 加上

<networkConnectors>
  <networkConnector uri="static:(tcp://192.168.127.1:61616,tcp://192.168.127.2:61616,tcp://192.168.127.3:61616)" duplex="false"/>
</networkConnectors>      

說白了就是把對方的位址拿過來

如果是三個叢集呢?

那麼就多加一個<networkConnector uri="tcp://..."/>

比如多了一個叢集3(IP:192.168.127.7,192.168.127.8,192.168.127.9)

叢集1 >>>>>>>>連結>>>>>>>> 叢集2&叢集3:192.168.127.1,192.168.127.2,192.168.127.3 加上

<networkConnectors>
  <networkConnector uri="static:(tcp://192.168.127.4:61616,tcp://192.168.127.5:61616,tcp://192.168.127.6:61616)" duplex="false"/>
  <networkConnector uri="static:(tcp://192.168.127.7:61616,tcp://192.168.127.8:61616,tcp://192.168.127.9:61616)" duplex="false"/>
</networkConnectors>      

叢集2 >>>>>>>>連結>>>>>>>> 叢集1&叢集3        和         叢集3 >>>>>>>>連結>>>>>>>> 叢集1&叢集2              照葫蘆畫瓢

最後還是要說一句:僅供參考啊!!!!!

小LUA

面對敵人的嚴刑逼供,我一個字也沒說,而是一五一十寫了下來。