<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          RabbitMQ的幾種工作模式和優(yōu)化建議

          共 2664字,需瀏覽 6分鐘

           ·

          2021-10-20 14:26

          點(diǎn)擊“藍(lán)字”,關(guān)注,置頂公眾號(hào)

          每日技術(shù)干貨,第一時(shí)間送達(dá)!

          1.組件介紹

          1. Broker:它提供一種傳輸服務(wù),它的角色就是維護(hù)一條從生產(chǎn)者到消費(fèi)者的路線,保證數(shù)據(jù)能按照指定的方式進(jìn)行傳輸,
          2. Exchange:消息交換機(jī),它指定消息按什么規(guī)則,路由到哪個(gè)隊(duì)列。
          3. Queue:消息的載體,每個(gè)消息都會(huì)被投到一個(gè)或多個(gè)隊(duì)列。
          4. Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來.
          5. Routing Key:路由關(guān)鍵字,exchange根據(jù)這個(gè)關(guān)鍵字進(jìn)行消息投遞。
          6. vhost:虛擬主機(jī),一個(gè)broker里可以有多個(gè)vhost,用作不同用戶的權(quán)限分離。
          7. Producer:消息生產(chǎn)者,就是投遞消息的程序.
          8. Consumer:消息消費(fèi)者,就是接受消息的程序.
          9. Channel:消息通道,在客戶端的每個(gè)連接里,可建立多個(gè)channel.

          2.消息發(fā)布和接收流程

          一.如何發(fā)送消息

          1. 生產(chǎn)者和Broker建立TCP連接
          2. 生產(chǎn)者和Broker建立通道
          3. 生產(chǎn)者通過通道消息發(fā)送給Broker,由Exchange將消息進(jìn)行轉(zhuǎn)發(fā)
          4. Exchange將消息轉(zhuǎn)發(fā)到止跌那個(gè)的Queue(隊(duì)列)

          二.如何接收消息

          1. 消費(fèi)者和Broker建立TCP連接
          2. 消費(fèi)者和Broker建立通道
          3. 消費(fèi)者監(jiān)聽制定的Queue(隊(duì)列)
          4. 當(dāng)有消息到達(dá)Queue時(shí)Broker默認(rèn)將消息推送給消費(fèi)者
          5. 消費(fèi)者接受到消息

          3.工作模式

          1. Direct 廣播模式

          是最簡(jiǎn)單的模式.即創(chuàng)建消息隊(duì)列的時(shí)候,指定一個(gè)路由鍵(RoutingKey).當(dāng)發(fā)送者發(fā)送消息的時(shí)候,指定對(duì)應(yīng)的Key.當(dāng)Key和消息隊(duì)列的RoutingKey一致的時(shí)候,消息將會(huì)被發(fā)送到該消息隊(duì)列中.

          2.Topic 主題交換區(qū)模式

          topic轉(zhuǎn)發(fā)信息主要是依據(jù)通配符,隊(duì)列和交換機(jī)的綁定主要是依據(jù)一種模式(通配符+字符串),而當(dāng)發(fā)送消息的時(shí)候,只有指定的Key和該模式相匹配的時(shí)候,消息才會(huì)被發(fā)送到該消息隊(duì)列中.通配符:*?表示一個(gè)詞,#?表示零個(gè)或多個(gè)詞

          3.fanout是路由廣播的形式

          fanout是路由廣播的形式,將會(huì)把消息發(fā)給綁定它的全部隊(duì)列,即便設(shè)置了key,也會(huì)被忽略.因此我們發(fā)送到交換機(jī)的消息會(huì)使得綁定到該交換機(jī)的每一個(gè)Queue接收到消息,這個(gè)時(shí)候就算指定了路由鍵(routingKey),或者規(guī)則(即上文中convertAndSend方法的參數(shù)2),也會(huì)被忽略!

          4.RabbitMQ優(yōu)化建議

          1、加大服務(wù)器帶寬

          訪問量大時(shí),較長(zhǎng)的數(shù)據(jù)容易將帶寬占滿。如服務(wù)器上傳帶寬為10M,則實(shí)際上傳帶寬可認(rèn)為1M,每秒上傳量為1M/1K=1K。如果把帶寬加到100M,則每秒上傳量為10K。一般情況下,RabbitMq服務(wù)器能夠接受的每秒寫入量為20K-50K(8G內(nèi)存),因此在帶寬在不足200M的時(shí)候,加大帶寬會(huì)產(chǎn)生很明顯的提升作用,再往上效果就可能不那么明顯了。

          2、加大內(nèi)存

          RabbitMq的機(jī)制是先將消息放在內(nèi)存中,然后分批寫入硬盤。小批量數(shù)據(jù)的寫入基本上都放在內(nèi)存中,內(nèi)存數(shù)據(jù)量過大時(shí)會(huì)一邊把客戶端的數(shù)據(jù)往內(nèi)存里寫,一邊將內(nèi)存里的陳舊數(shù)據(jù)往硬盤里寫,這樣會(huì)對(duì)速度造成較嚴(yán)重的損耗。適度的增加內(nèi)存,隊(duì)列將會(huì)更多的消息放在內(nèi)存中,增加系統(tǒng)的處理速度。

          3、使用固態(tài)硬盤

          機(jī)械硬盤的寫入速度較慢,處理大量數(shù)據(jù)時(shí)機(jī)械硬盤對(duì)性能的損耗十分嚴(yán)重。如果要存放1億條數(shù)據(jù),所需要的硬盤大小為100G,建議采用100-500G固態(tài)硬盤。再加上消費(fèi)端在不斷的處理數(shù)據(jù),一般待處理的消息能夠達(dá)到千萬級(jí)別已經(jīng)相當(dāng)不容易了

          4、增加生產(chǎn)者

          服務(wù)器可以建立多個(gè)連接,單個(gè)生產(chǎn)者往往不能充分利用服務(wù)器的潛能,建立多個(gè)生產(chǎn)者之后,服務(wù)器處理能力將會(huì)得到充分利用。一般情況下,一個(gè)生產(chǎn)者每秒可以傳入1000-5000條消息,在1-10這個(gè)范圍內(nèi),每增加一個(gè)生產(chǎn)者,處理速度就會(huì)相對(duì)單生產(chǎn)者增加一倍

          5、增加消費(fèi)者

          消費(fèi)者增多時(shí),出隊(duì)速度有明顯改善。該方案對(duì)于出隊(duì)速度的影響有限,1-10個(gè)進(jìn)程范圍內(nèi),相對(duì)于單進(jìn)程只有一倍左右的提升,建議線程開2-5個(gè)即可,再多可能影響不大。出現(xiàn)該現(xiàn)象的原因可能是服務(wù)器帶寬或硬件處理能力有限,消費(fèi)者增加了也沒什么用處。因?yàn)闆]有實(shí)際環(huán)境測(cè)試,此條只列為建議,采用前可以多做實(shí)驗(yàn)

          6、改網(wǎng)絡(luò)訪問為本地訪問

          該方案在消費(fèi)端/生產(chǎn)端與RabbitMq服務(wù)器部署在同一臺(tái)電腦時(shí)有用,因?yàn)槭÷粤司W(wǎng)絡(luò)傳輸,大大節(jié)省了處理時(shí)間。如果消費(fèi)端/生產(chǎn)端與RabbitMq服務(wù)器分開部署,該方案就不能使用了。在代碼中將IP地址127.0.0.1改為localhost即可

          來源:blog.csdn.net/smartsteps/article/details/107002567



          往期推薦



          扔掉 Postman ,試試 IntelliJ IDEA 自帶的插件!

          Guava RateLimiter 如何實(shí)現(xiàn) API 限流的?

          Java8日期處理方式,日常工作必備!

          最牛逼 Java 日志框架 — Log4j2,性能無敵,橫掃對(duì)手...

          為什么阿里強(qiáng)制 boolean 類型變量不能使用 is 開頭?

          SQL 有下面這些寫法的注意了



          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩国产精品一级片 | 亚洲欧美一级 | 中国操逼小视频 | 热热av | 日韩欧美电影一区二区三区 |