這篇文章主要介紹“消息隊列Rabbitmq的交換器類型有哪些”,在日常操作中,相信很多人在消息隊列Rabbitmq的交換器類型有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”消息隊列Rabbitmq的交換器類型有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
成都創(chuàng)新互聯(lián)是專業(yè)的牟定網(wǎng)站建設公司,牟定接單;提供成都網(wǎng)站設計、網(wǎng)站制作,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行牟定網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
一、交換器類型
在rabbitmq中,生產(chǎn)者的消息都是通過交換器來接收,然后再從交換器分發(fā)到不同的隊列中去,在分發(fā)的過程中交換器類型會影響分發(fā)的邏輯。
rabitmq中的交換器有4種類型,分別為fanout、direct、topic、headers四種,其中前三種較為常見,后面一種用的比較少。
二、fanout
一般情況下交換器分發(fā)會先找出綁定的隊列,然后再判斷routekey,來決定是否將消息分發(fā)到某一個隊列中;但如果交換器的類型為fanout,那么交換器就不再判斷routekey了,而是將消息直接分發(fā)到綁定的隊列中去,如下測試代碼
Channel channel = connection.createChannel(); //在rabbitmq中創(chuàng)建一個信道
channel.exchangeDeclare("exchangeName", "fanout"); //創(chuàng)建一個type為fanout的交換器
channel.queueDeclare("queueName"); //創(chuàng)建一個隊列
channel.queueBind("queueName", "exchangeName", "routingKey"); //將隊列和交換器綁定
三、direct
在類型為direct的情況下,交換器在分發(fā)消息的時候同樣會先獲取綁定的隊列,然后還會再判斷routeing;當交換器發(fā)現(xiàn)類型為direct判斷routeing的規(guī)則是完全匹配模式,只有消息完全等于到routeing的時候,才會將消息分發(fā)到指定隊列;
一個隊列是可以指定多個路由鍵的,我們假設有兩個隊列,分別是隊列一、隊列二;在隊列一中指定了三個路由鍵,分別是zhangsan、lisi,wangwu,在隊列二中指定了一個隊列鍵lisi,指定多個路由鍵的代碼如下所示:
Channel channel = connection.createChannel(); //在rabbitmq中創(chuàng)建一個信道
channel.exchangeDeclare("exchangeName", "direct"); //創(chuàng)建一個type為direct的交換器
channel.queueDeclare("queueName"); //創(chuàng)建一個隊列
channel.queueBind("queueName", "exchangeName", "zhangsna"); //綁定并設置路由鍵
channel.queueBind("queueName", "exchangeName", "lisi"); //綁定并設置路由鍵
channel.queueBind("queueName", "exchangeName", "wangwu"); //綁定并設置路由鍵
當生產(chǎn)者發(fā)送了一條routeting為zhangsan的消息到交換器中,交換器在分發(fā)的時候只會把消息分發(fā)到隊列一里面去,因為交換器在routeting匹配的時候只匹配到了隊列一,因此隊列二不會收到消息;
當生產(chǎn)者再次發(fā)送了一條routeting為lisi的消息到交換器中,交換器在分發(fā)的時候會把消息分發(fā)到隊列一和隊列二兩個隊列里面去,因為交換器在routeting匹配的時候匹配都匹配成功,因此兩個隊列都收到了消息;
四、topic
在類型為topic的情況下,交換器分發(fā)消息的時候也需要同時匹配bindKey和routingKey;但與direct類型不同的是當交換器發(fā)現(xiàn)類型為topic時候,判斷routeing的規(guī)則是模糊匹配模式。
rabitmq自定義了一套匹配規(guī)則,在這里我假設生產(chǎn)者發(fā)送了一個消息,其中的的routingKey為wiki.imooc.com,那么交換器為topic類型時候,想要獲取到這條消息,可以用*號作為通配符,來指定routingKey,分別是*.*.com、*.imooc.*、*wiki.imooc.*;同樣也可以使用#作為通配符來指定路由鍵,例如wiki.#、#.com;
在上面的通配符列子中,我們需要掌握這幾點:
路由鍵以.為分隔符,每一個分隔符的代表一個單詞
通配符*匹配一個單詞、通配符#可以匹配多個單詞
*可以在routingKey和bindKey上使用,#只能用于RoutingKey中
五、headers
類型為headers的交換器與前面三種匹配fang式完全不一樣,它不依賴與bindingKey和routingKey,而是在綁定隊列與交換器的時候指定一個鍵值對;當交換器在分發(fā)消息的時候會先解開消息體里的headers數(shù)據(jù),然后判斷里面是否有所設置的鍵值對,如果發(fā)現(xiàn)匹配成功,才將消息分發(fā)到隊列中;這種交換器類型在性能上相對來說較差,在實際工作中很少會用到。
到此,關(guān)于“消息隊列Rabbitmq的交換器類型有哪些”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
本文名稱:消息隊列Rabbitmq的交換器類型有哪些
URL地址:http://weahome.cn/article/gshhje.html