創建信息 發給 消息中間件服務器, 消息中間件客戶端 就能讀取信息消費
使用消息中間件後, 兩個應用程序不需要直接通訊, 可實現應用之間解耦, 流量削峯, 數據分發
消息中間件有很多種,如 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
下載,啓動
服務端訪問地址 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