RabbitMQ學習總結(6)——消息的路由分發機制詳解

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

一、Routing(路由) (using the Java client)

在前面的學習中,構建了一個簡單的日志記錄系統,能夠廣播所有的日志給多個接收者,在該部分學習中,將添加一個新的特點,就是可以只訂閱一個特定的消息源,也就是說能夠直接把關鍵的錯誤日志消息發送到日志文件保存起來,不重要的日志信息文件不保存在磁盤中,但是仍然能夠在控制臺輸出,那么這便是我們這部分要學習的消息的路由分發機制。

二、Bindings(綁定)

在前面的學習中已經創建了綁定(bindings),代碼如下:
  channel.queueBind(queueName, EXCHANGE_NAME, "");    

一個綁定就是一個關于exchange和queue的關系,它可以簡單的被理解為:隊列是從這個exchange中獲取消息的。

綁定可以采取一個額外的routingKey的參數,為了避免與basicPublish參數沖突,稱之為一個綁定Key,這是如何創建一個帶routingKey的綁定的關鍵。

channel.queueBind(queueName, EXCHANGE_NAME, "black");

一個綁定Key依賴于exchange的類型,像之前使用fanout類型的exchange,完全忽略了該綁定key的值。

三、Direct exchange(直接交換機)


前面實現的日志記錄系統中廣播所有的消息給所有的消費者,現在對其進行擴展,允許根據信息的嚴重程度來對消息進行過濾,比如,希望一個程序寫入到磁盤的日志消息只接收錯誤的消息,而不是浪費磁盤保存所有的日志消息。

為了實現這個目標,使用一個fanout類型的exchange,顯然是不能夠滿足這樣的需求的,因為它只能廣播所有的消息。

為此將使用一個direct exchange來代替fanout exchange,direct exchange使用簡單的路由算法,將消息通過綁定的Key匹配將要到達的隊列。

從上面的結構圖中可以看出direct exchange X綁定著兩個queue(Q1,Q2),第一個queue綁定的routingKey為orange,第二個有兩個routingKey被綁定,一個routingKey為black,另外一個routingKey為green.

說明:發送帶有routingKey為orange的消息到X(exchange)中,X將該消息路由到Q1中,發送帶有routingKey為black和green的消息都將被路由到Q2中,其他所有消息將會被丟棄。

四、Multiple bindings(多綁定)

多個隊列綁定相同的routingKey是允許的,在上述實例中,可以把X和Q1用routingKey:black綁定起來,這種情況下,direct exchange將像fanout類型的exchange一樣會將消息廣播都到所有匹配的queues中,即一個routingKey為black的消息將會被發送到Q1和Q2中。

五、Emitting logs(發送的日志)

使用direct代替fanout類型的exchange,發送消息到一個direct exchange中,將根據消息的重要程度作為routingKey,這樣接收程序能夠選擇它想要接收的日志信息,首先必須先創建一個exchange.
    channel.exchangeDeclare(EXCHANGE_NAME, "direct");

其次,發送一條信息:
   channel.basicPublish(EXCHANGE_NAME, severity, null, message.getBytes());
為了簡化程序,將severity設定為info、warning、error三種類型中的一種。

六、Subscribing(訂閱消息)

接收者根據自己感興趣的severity來創建一個新到的綁定。
String queueName = channel.queueDeclare().getQueue();for(String severity : argv){    channel.queueBind(queueName, EXCHANGE_NAME, severity);
}

七、Putting it all together(代碼實現)

EmitLogDirect.java代碼清單如下:


[java] view plain copy print ? 在CODE上查看代碼片 派生到我的代碼片
public?class?EmitLogDirect?{?? ?? ????private?static?final?String?EXCHANGE_NAME?=?"direct_logs";?? ?? ????public?static?void?main(String[]?argv)?? ??????????????????throws?java.io.IOException?{?? ?? ????????ConnectionFactory?factory?=?new?ConnectionFactory();?? ????????factory.setHost("localhost");?? ????????Connection?connection?=?factory.newConnection();?? ????????Channel?channel?=?connection.createChannel();?? ?? ????????channel.exchangeDeclare(EXCHANGE_NAME,?"direct");?? ?? ????????String?severity?=?getSeverity(argv);?? ????????String?message?=?getMessage(argv);?? ?? ????????channel.basicPublish(EXCHANGE_NAME,?severity,?null,?message.getBytes());?? ????????System.out.println("?[x]?Sent?'"?+?severity?+?"':'"?+?message?+?"'");?? ?? ????????channel.close();?? ????????connection.close();?? ????}?? ????//..?? }??

ReceiveLogsDirect代碼 清單如下:
[java] view plain copy print ? 在CODE上查看代碼片 派生到我的代碼片
public?class?ReceiveLogsDirect?{?? ?? ????private?static?final?String?EXCHANGE_NAME?=?"direct_logs";?? ?? ????public?static?void?main(String[]?argv)?? ??????????????????throws?java.io.IOException,?? ??????????????????java.lang.InterruptedException?{?? ?? ????????ConnectionFactory?factory?=?new?ConnectionFactory();?? ????????factory.setHost("localhost");?? ????????Connection?connection?=?factory.newConnection();?? ????????Channel?channel?=?connection.createChannel();?? ?? ????????channel.exchangeDeclare(EXCHANGE_NAME,?"direct");?? ????????String?queueName?=?channel.queueDeclare().getQueue();?? ?? ????????if?(argv.length?<?1){?? ????????????System.err.println("Usage:?ReceiveLogsDirect?[info]?[warning]?[error]");?? ????????????System.exit(1);?? ????????}?? ?? ????????for(String?severity?:?argv){?? ????????????channel.queueBind(queueName,?EXCHANGE_NAME,?severity);?? ????????}?? ?? ????????System.out.println("?[*]?Waiting?for?messages.?To?exit?press?CTRL+C");?? ?? ????????QueueingConsumer?consumer?=?new?QueueingConsumer(channel);?? ????????channel.basicConsume(queueName,?true,?consumer);?? ?? ????????while?(true)?{?? ????????????QueueingConsumer.Delivery?delivery?=?consumer.nextDelivery();?? ????????????String?message?=?new?String(delivery.getBody());?? ????????????String?routingKey?=?delivery.getEnvelope().getRoutingKey();?? ?? ????????????System.out.println("?[x]?Received?'"?+?routingKey?+?"':'"?+?message?+?"'");?? ????????}?? ????}?? }??
	編譯和往常一樣(參見以往教程用于編譯和類路徑的建議)。現在,為了方便起見,我們將使用一個環境變量$CP(%CP%在Windows上)的運行時類路徑的例子。
如果你只想保存 “警告”和“錯誤”(而不是“信息”)日志消息到一個文件,打開一個控制臺和type:

[*] Waiting for logs. To exit press CTRL+C

[x] Sent 'error':'Run. Run. Or it will explode.'
$ java -cp $CP ReceiveLogsDirect warning error > logs_from_rabbit.log
$ java -cp $CP ReceiveLogsDirect info warning error
$ java -cp $CP EmitLogDirect error "Run. Run. Or it will explode."

轉載于:https://my.oschina.net/zhanghaiyang/blog/594446

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387554.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387554.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387554.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kaggle爆文:一個框架解決幾乎所有機器學習問題

上周一個叫 Abhishek Thakur 的數據科學家&#xff0c;在他的 Linkedin 發表了一篇文章 Approaching (Almost) Any Machine Learning Problem&#xff0c;介紹他建立的一個自動的機器學習框架&#xff0c;幾乎可以解決任何機器學習問題&#xff0c;項目很快也會發布出來。 這篇…

C# HttpWebRequest GET HTTP HTTPS 請求

這個需求來自于我最近練手的一個項目&#xff0c;在項目中我需要將一些自己發表的和收藏整理的網文集中到一個地方存放&#xff0c;如果全部采用手工操作工作量大而且繁瑣&#xff0c;因此周公決定利用C#來實現。在很多地方都需要驗證用戶身份才可以進行下一步操作&#xff0c;…

HttpStatusCode

https://docs.microsoft.com/en-us/dotnet/api/system.net.httpstatuscode?viewnetframework-4.7.2 422 UnprocessableEntity What HTTP status response code should I use if the request is missing a required parameter? Status 422 seems most appropiate based on the…

numpy 和tensorflow 中的乘法

矩陣乘法&#xff1a;tf.matmul() np.dot() &#xff0c; 逐元素乘法&#xff1a;tf.multiply() np.multiply()轉載于:https://www.cnblogs.com/lizhiqing/p/10307760.html

啟用了不安全的HTTP方法

安全風險&#xff1a;可能會在Web 服務器上上載、修改或刪除Web 頁面、腳本和文件。可能原因&#xff1a;Web 服務器或應用程序服務器是以不安全的方式配置的。修訂建議&#xff1a;如果服務器不需要支持WebDAV&#xff0c;請務必禁用它&#xff0c;或禁止不必要的HTTP 方法。方…

Mysql學習總結(4)——MySql基礎知識、存儲引擎與常用數據類型

2019獨角獸企業重金招聘Python工程師標準>>> 1、基礎知識 1.1、數據庫概述 簡單地說&#xff1a;數據庫&#xff08;Database或DB&#xff09;是存儲、管理數據的容器&#xff1b;嚴格地說&#xff1a;數據庫是“按照某種數據結構對數據進行組織、存儲和管理的容器”…

django權限二(多級菜單的設計以及展示)

多級權限菜單設計級標題欄 我們現在只有數據展示,要進入其他url還需要手動的輸入路徑,非常的麻煩,所以我們要設計 一個導航欄以及側邊多級菜單欄,這個展示是通過stark組件的設計的增刪改查頁面,而 每一個 頁面我們都需要有導航欄和側邊的權限菜單欄,所以把這個公共的部分提起到…

6.17 dokcer(一)Compose 簡介

Compose 簡介 Compose 項目是 Docker 官方的開源項目&#xff0c;負責實現對 Docker 容器集群的快速編排。從功能上看&#xff0c;跟 OpenStack 中的 Heat 十分類似。 其代碼目前在 https://github.com/docker/compose 上開源。 Compose 定位是 「定義和運行多個 Docker 容器的…

【系統架構理論】一篇文章精通:Spring Cloud Netflix Eureka

是官方文檔的總結 http://spring.io/projects/spring-cloud-netflix#overview 講解基于2.0.2版本官方文檔 https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.0.2.RELEASE/single/spring-cloud-netflix.html Netflix提供了以下功能&#xff1a; 服務發現&am…

Flink DataStream 編程入門

流處理是 Flink 的核心&#xff0c;流處理的數據集用 DataStream 表示。數據流從可以從各種各樣的數據源中創建&#xff08;消息隊列、Socket 和 文件等&#xff09;&#xff0c;經過 DataStream 的各種 transform 操作&#xff0c;最終輸出文件或者標準輸出。這個過程跟之前文…

騰訊手游如何提早揭露游戲外掛風險?

目前騰訊SR手游安全測試限期開放免費專家預約&#xff01;點擊鏈接&#xff1a;手游安全測試立即預約&#xff01; 作者&#xff1a;sheldon&#xff0c;騰訊高級安全工程師 商業轉載請聯系騰訊WeTest獲得授權&#xff0c;非商業轉載請注明出處。 文中動圖無法顯示&#xff0c…

基于ARM Cortex-M0+ 的Bootloader 參考

源&#xff1a; 基于ARM Cortex-M0內核的bootloader程序升級原理及代碼解析轉載于:https://www.cnblogs.com/LittleTiger/p/10312784.html

小猿圈web前端之網站性能優化方案

現在前端不僅要能做出一個網站頁面&#xff0c;還要把這個頁面做的炫酷&#xff0c;那需要很大程度的優化&#xff0c;那么怎么優化才更好呢&#xff1f;小猿圈總結了一下自己優化的方案&#xff0c;感興趣的朋友可以看一下。一般網站優化都是優化后臺&#xff0c;如接口的響應…

下面介紹一個開源的OCR引擎Tesseract2。值得慶幸的是雖然是開源的但是它的識別率較高,并不比其他引擎差勁。網上介紹Tessnet2也是當時時間排名第三的識別引擎,只是后來慢慢不維護了,目前是G

下面介紹一個開源的OCR引擎Tesseract2。值得慶幸的是雖然是開源的但是它的識別率較高&#xff0c;并不比其他引擎差勁。網上介紹Tessnet2也是當時時間排名第三的識別引擎&#xff0c;只是后來慢慢不維護了&#xff0c;目前是Google在維護&#xff0c;大家都知道Google 在搞電子…

js 更改json的 key

let t data.map(item > {return{fee: item[費用],companyName1: item.companyName,remark1: item.remark,beginTime1: item.beginTime,endTime1: item.endTime}})console.log(t) 源地址&#xff1a;https://www.cnblogs.com/Marydon20170307/p/8676611.html轉載于:https:/…

1.4版本上線(第八次會議)

在小組成員連夜趕工的奮斗下&#xff0c;終于在昨天深夜成功實現了UI界面功能 至此&#xff0c;我們的系統終于真正可實用而不是局限在命令行進行互動了 由于python嵌入數據庫功能實現難度較大&#xff0c;迫于時間的局限性&#xff0c;我們選擇了用json文件與txt文件進行替代&…

分UV教程

第一步 首先&#xff0c;打開一個練習場景“空中預警機1.max”&#xff08;這事小弟平時的練習做的不好獻丑了&#xff09;。&#xff08;圖01&#xff09; 圖01 第二步 這里我們拿機翼來舉例子&#xff0c;隱藏除機翼意外的其他模型。&#xff08;圖02&#xff09; 圖02 第三步…

k8s系列--- dashboard認證及分級授權

http://blog.itpub.net/28916011/viewspace-2215214/ 因版本不一樣&#xff0c;略有改動 Dashboard官方地址&#xff1a; https://github.com/kubernetes/dashboard dashbord是作為一個pod來運行&#xff0c;需要serviceaccount賬號來登錄。 先給dashboad創建一個專用的認證信息…

JAVA項目開發

16年java軟件開發經驗&#xff0c;全職項目開發&#xff0c;項目可簽合同、開普票和專票。 主要承接項目&#xff1a; 1、網站開發項目 自主開發千帆CMS動態發布系統&#xff0c;基于java/springboot2/jpa/easyui開發&#xff0c;簡單易用&#xff0c;后臺與前端分離&#xff0…

3dmax基本操作

1、基本操作平移視圖&#xff08;你所說的移動&#xff09;&#xff1a;CTRLP&#xff0c;或者用&#xff0c;滾輪。按住鼠標滾輪不放拖動&#xff0c;就行了。旋轉&#xff1a; ALT滾輪。按住ALT鍵不放&#xff0c;利用滾輪的移動&#xff08;滾輪也要按著不放&#xff09…