3.消息中間件MQ

創建信息 發給 消息中間件服務器, 消息中間件客戶端 就能讀取信息消費

使用消息中間件後, 兩個應用程序不需要直接通訊, 可實現應用之間解耦, 流量削峯, 數據分發

消息中間件有很多種,如 ActiveMQ (Java), RocketMQ(阿里開發的,雙11用的)等等

特性 ActiveMQ RabbitMQ RocketMQ Kafka
單機吞吐量 萬級 萬級 10 萬級 10 萬級
開發語言 java erlang java scala
時效性 ms 級 us級,這是 RabbitMQ 的一大特點,延遲最低 ms 級  ms 級
可用性 高,基於主從架構 高,基於主從架構 非常高,分佈式架構 非常高,分佈式架構
消息可靠性 有較低的概率丟失數據 基本不丟 經過參數優化配置,可以做到 0 丟失 同 RocketMQ
功能支持 MQ 領域的功能極其完備 基於 erlang 開發,併發能力很強,性能極好,延時很低 MQ 功能較爲完善,還是分佈式的,擴展性好 功能較爲簡單,主要支持簡單的 MQ 功能,在大數據領域的實時計算以及日誌採集被大規模使用

 

目錄 

ActiveMQ

隊列模式 java案例:


ActiveMQ

下載,啓動

服務端訪問地址 http://127.0.0.1:8161 可以看到都有哪些消息被創建了,哪些被消費了

activeMQ 有兩種模式,分別是隊列模式和主題模式

http://127.0.0.1:8161/admin/queues.jsp

http://127.0.0.1:8161/admin/topics.jsp

隊列模式:

就是分食模式。 比如生產方發了 10條消息到 activeMQ 服務器, 而此時有多個 消費方,那麼這些消費方就會瓜分這些10條消息,一條消息只會被一個消費方得到。

主題模式:

就是訂閱模式。 比如生產方發了10條消息,而此時有多個消費方,那麼多個消費方都能得到這 10條消息,就如同訂閱公衆號那樣。

注: 主題模式, 消費者要先啓動。 如果在生產者生產完成之後再啓動,是看不到消息的


java案例:

導入activemq 包

隊列/主題 生產者:
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;
public class TestProducer {
    //服務地址,端口默認61616
    private static final String url="tcp://127.0.0.1:61616";
    //這次發送的消息名稱
    private static final String topicName="queue_style";

    public static void main(String[] args) throws JMSException {
        //0. 先判斷端口是否啓動了Active MQ 服務器,8161是否打開
        ...
        //1.創建ConnectiongFactory,綁定地址
        ConnectionFactory factory=new ActiveMQConnectionFactory(url);
        //2.創建Connection
        Connection connection= factory.createConnection();
        //3.啓動連接
        connection.start();
        //4.創建會話
        Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5.創建一個目標 (隊列/主題類型)
        Destination destination=session.createQueue(topicName);//隊列
        Destination destination=session.createTopic(topicName);//主題
        //6.創建一個生產者
        MessageProducer producer=session.createProducer(destination);
        for (int i = 0; i < 100; i++) {
        //7.創建消息
            TextMessage textMessage=session.createTextMessage("隊列/主題消息-"+i);
        //8.發送消息
            producer.send(textMessage);
            System.out.println("發送:"+textMessage.getText());
        }
        //7. 關閉連接
        connection.close();
    }
}
隊列/主題 消費者:
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;
public class TestConsumer {
    //服務地址,端口默認61616
    private static final String url="tcp://127.0.0.1:61616";
    //這次消費的消息名稱
    private static final String topicName="queue_style";
 
    //消費者有可能是多個,爲了區分不同的消費者,爲其創建隨機名稱
    private static final String consumerName="consumer-" + RandomUtil.randomString(5);
    public static void main(String[] args) throws JMSException {
        //0. 先判斷端口是否啓動了Active MQ 服務器,8161是否打開
        ...
        System.out.printf("%s 消費者啓動了。 %n", consumerName);
 
        //1.創建ConnectiongFactory,綁定地址
        ConnectionFactory factory=new ActiveMQConnectionFactory(url);
        //2.創建Connection
        Connection connection= factory.createConnection();
        //3.啓動連接
        connection.start();
        //4.創建會話
        Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5.創建一個目標 (隊列/主題類型)
        Destination destination=session.createQueue(topicName);//隊列
        Destination destination=session.createTopic(topicName);//主題
        //6.創建一個消費者
        MessageConsumer consumer=session.createConsumer(destination);
        //7.創建一個監聽器
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message arg0) {
                TextMessage textMessage=(TextMessage)arg0;
                try {
                    System.out.println(consumerName +" 接收消息:"+textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
        //8. 因爲不知道什麼時候有,所以沒法主動關閉,就不關閉了,一直處於監聽狀態
        //connection.close();
    }
}

 

 

 

 

RocketMQ 

下載安裝

bin   啓動腳本

conf    配置文件

 

啓動

默認內存特別大, runbroker.sh  runserver.sh 修改jvm內存

啓動NameServer

啓動Broker

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章