RabbitMQ-路由模式
一、簡介
上一篇我們提到《RabbitMQ-訂閱模式》從而實現了一個訊息被多個消費者消費,其大致原理是消費者1和消費者2都建立自己的佇列,然後將佇列繫結到交換機即可實現。
但是我們想象一下這樣的場景,比如我們有兩個系統,假設就叫做前臺系統和搜尋系統,那麼我們的後臺系統對某一商品進行增刪改查,就需求傳送訊息到前臺和搜尋系統。但是我們就在想,增刪改查四個操作到底哪些操作需求通知到不同的系統,比如新增商品,我們需要通知到搜尋系統,但是有必要通知到前臺系統嗎?
當然上面的場景可能有些不恰當,但為了做個說明並不為過,這個時候訂閱模式是不是就不滿足我們的需求了?因為我們需要將修改商品、刪除商品的訊息傳送到前臺和搜尋系統,但是新增商品只需要傳送給搜尋系統,這就引出了我們今天要學習的路由模式,如下圖:
二、編碼實現
2.1、生產者
public class Producer {
public static void main(String[] argv) throws Exception {
// 獲取到連線以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 宣告exchange
channel.exchangeDeclare(QueueUtil.EXCHANGE_NAME_ROUTING, "direct");
// 訊息內容
String message = "Hello World!";
// 傳送一個routingKey為delete的訊息
channel.basicPublish(QueueUtil.EXCHANGE_NAME_ROUTING, "delete", null, message.getBytes());
channel.close();
connection.close();
}
}
2.2、消費者1
public class Receiver1 {
public static void main(String[] argv) throws Exception {
// 獲取到連線以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 宣告佇列
channel.queueDeclare(QueueUtil.QUEUE_NAME_ROUTING1, false, false, false, null);
// 繫結佇列到交換機,接收routingKey為update的訊息
channel.queueBind(QueueUtil.QUEUE_NAME_ROUTING1, QueueUtil.EXCHANGE_NAME_ROUTING, "update");
// 同一時刻伺服器只會發一條訊息給消費者
channel.basicQos(1);
// 定義佇列的消費者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 監聽佇列,手動返回完成
channel.basicConsume(QueueUtil.QUEUE_NAME_ROUTING1, false, consumer);
// 獲取訊息
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println("Receiver1 Received:" + message);
Thread.sleep(10);
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
}
2.3、消費者2
public class Receiver2 {
public static void main(String[] argv) throws Exception {
// 獲取到連線以及mq通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 宣告佇列
channel.queueDeclare(QueueUtil.QUEUE_NAME_ROUTING2, false, false, false, null);
// 繫結佇列到交換機
channel.queueBind(QueueUtil.QUEUE_NAME_ROUTING2, QueueUtil.EXCHANGE_NAME_ROUTING, "delete");
// 同一時刻伺服器只會發一條訊息給消費者
channel.basicQos(1);
// 定義佇列的消費者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 監聽佇列,手動返回完成
channel.basicConsume(QueueUtil.QUEUE_NAME_ROUTING2, false, consumer);
// 獲取訊息
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println("Receiver2 Received:" + message);
Thread.sleep(10);
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
}
}
三、測試
可以看到,一個routingKey為delete的訊息只會被消費者2消費。
相關文章
- RabbitMQ-訂閱模式MQ模式
- RabbitMQ-萬用字元模式MQ字元模式
- RabbitMQ-初見MQ
- RabbitMQ-簡單佇列MQ佇列
- RabbitMQ六種佇列模式-路由模式MQ佇列模式路由
- Vue路由History模式分析Vue路由模式
- Vue路由Hash模式分析Vue路由模式
- 前端路由模式詳解前端路由模式
- 前端路由: hash & history 模式前端路由模式
- 前端路由原理之 hash 模式和 history 模式前端路由模式
- 每日一學: Routing路由模式路由模式
- vue history路由模式 部署NginxVue路由模式Nginx
- LVS - 直接路由(DR)模式示例路由模式
- 使用Docker Swarm模式路由網格DockerSwarm模式路由
- LVS-DR直連路由模式路由模式
- vue-router 原始碼:路由模式Vue原始碼路由模式
- 【訊息佇列】RabbitMq-交換機模型佇列MQ模型
- RabbitMQ-如何保證訊息不丟失MQ
- vue--前端路由及vue-router兩種模式Vue前端路由模式
- Vue history 路由模式微信自定義分享總結Vue路由模式
- 【訊息佇列】RabbitMq-宣告佇列與交換機佇列MQ
- 家用電信光貓更換教程+設定路由模式路由模式
- 分頁如何變成強制路由模式樣式呢?路由模式
- 如何去除vue專案中的 # — vue路由的History模式Vue路由模式
- RabbitMQ-如何保證訊息在99.99%的情況下不丟失MQ
- Angular路由——子路由Angular路由
- 前端框架路由實現的Hash和History兩種模式的區別前端框架路由模式
- 配置nginx解決vue路由history模式下重新整理404問題NginxVue路由模式
- Vue 路由 history 模式踩坑記錄:nginx 配置解決 404 問題Vue路由模式Nginx
- 前端路由(手寫路由)前端路由
- Angular路由——路由守衛Angular路由
- Angular路由——輔助路由Angular路由
- Angular路由——路由基礎Angular路由
- OSPF路由 與 ISIS路由 與路由學習對比路由
- 靜態路由和動態路由路由
- RabbitMQ-訊息永續性、確認機制、拒絕、預取數量、分配策略MQ
- Dubbo 路由規則之標籤路由路由
- 前端路由與後端路由的思考前端路由後端