亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入理解Spring中RabbitMQ的Channel

 更新時間:2023年08月28日 09:17:12   作者:Sam_Deep_Thinking  
這篇文章主要介紹了深入理解Spring中RabbitMQ的Channel,在RabbitMq中,channel表示邏輯連接或者叫虛擬連接,是棣屬于TCP連接的,一個TCP連接里可以創(chuàng)建多個channel,在Rabbit MQ里,消息的發(fā)送和接收都是基于channel的,需要的朋友可以參考下

概述

在 AMQP 協(xié)議中,有 channel 的概念,在 RabbitMq 中, channel 表示邏輯連接或者叫虛擬連接,是棣屬于 TCP 連接的。

一個 TCP 連接里可以創(chuàng)建多個 channel ,在 Rabbit MQ 里,消息的發(fā)送和接收都是基于 channel 的。

connection和channel的關(guān)系

有了 TCP 連接后,還需要 channel 的原因如下:

  • 創(chuàng)建和銷毀TCP連接很耗時;
  • 打開太多TCP連接,耗操作系統(tǒng)資源,并發(fā)量大到一定程度,系統(tǒng)的吞吐量會降低;
  • 使用一個connection多channel的方式,可以提升連接的利用率。

因此采用多個 channel 多路復(fù)用一個 TCP 連接的方式才比較合理。

channel線程不安全

channel 不是線程安全的,線程并發(fā)的去訪問同一個 channel 會出問題。

這里有幾種處理方式:

  1. 全局公用一個channel且使用全局鎖,讓操作channel排隊.這種明顯性能是不行的;
  2. 一個線程對應(yīng)創(chuàng)建一個新的channel,但是要處理好一個連接能支撐的最大channel數(shù)量;
  3. 一個線程對應(yīng)一個channel,但是是從channel池子拿的,不是每次都創(chuàng)建新的.一旦一個線程完成了一個channel的使用,它將返回到池中,從而使該channel可用于另一個線程。

量不大的話,使用第二種方式就可以了。量大的話,建議使用第三種方式,畢竟創(chuàng)建和銷毀 channel 也是耗時耗資源的.在 spring amqp 中,提供了一個緩存 channel 的方案。

可以在創(chuàng)建 CachingConnectionFactory 時指定緩存的模式。

connectionFactory.setCacheMode(CachingConnectionFactory.CacheMode.CHANNEL);
connectionFactory.setChannelCacheSize(25);

上面的兩行代碼,表示 channel 共用唯一的一個連接,且緩存了25個 channel ,注意這里的25個并不是說,這個連接里只能最多創(chuàng)建25個 channel ,而是說最多緩存25個 channel 。舉個例子,假設(shè)并發(fā)發(fā)送100條消息,在 CachingConnectionFactory.CacheMode.CHANNEL 模式下,瞬間會創(chuàng)建100個 channel 的,然后往緩存里放25個 channel ,當(dāng)流量下去了,剛剛創(chuàng)建的多余的 channel 會自動關(guān)閉掉的,緩存里只保留25個。

使用這種方式的話,要注意緩存的 channel 數(shù)量,不能太小,不然流量一大,仍然會造成頻繁關(guān)閉 channel 的情況。當(dāng)然我們也不能說有多少并發(fā),就創(chuàng)建多少個 channel ,還是要限制一下,這個時候可以使用:

connectionFactory.setChannelCheckoutTimeout(1000);

當(dāng) ChannelCheckoutTimeout 的值大于0的時候, ChannelCacheSize 的值就是最大的 channel 數(shù)量了,一旦從緩存中獲取不到 channel ,等待 ChannelCheckoutTimeout 毫秒后,如果還是獲取不到的,就會拋 AmqpTimeoutException 了。

我們也可以自己實現(xiàn) channel pool ,但是不太建議怎么做,畢竟 spring amqp 還是相當(dāng)成熟的,直接使用就可以了。

CacheMode.CHANNEL模式性能

如上文所述,采用了 CacheMode.CHANNEL 的模式的話,就是一線程一 channel 形式,且這些 channel 共享了同一個連接,也即是共享同一個 socket

當(dāng)并發(fā)量一大的時候,可能導(dǎo)致同一時刻,多個線程都想往這個 socket 上寫數(shù)據(jù)。

為了避免這種情況,只能加鎖,讓拿不到鎖的線程 block 住。做了壓力測試,并發(fā)10個線程發(fā)送1000000條消息,結(jié)果線程被 block 住了,如下圖:

在這里插入圖片描述

作者也提到,當(dāng)流量很大的時候,使用 CacheMode.CONNECTION 的模式,可以提高發(fā)送效率。

channel的監(jiān)控

RabbitMQ Admin UI 提供了一個監(jiān)控 channel 的界面,我們主要關(guān)注兩點:

channel有沒有可能泄露,打開了channel,卻沒有關(guān)閉channel;打開channel和關(guān)閉channel的速率。

如果通道打開操作的速率始終高于通道關(guān)閉操作的速率,那就可能發(fā)生 channel 泄露了。

如下圖:

在這里插入圖片描述

如果打開和關(guān)閉 channel 的速率都很高,也值得觀察一下。因為可能是沒有緩存 channel 了。

當(dāng)流量繼續(xù)增大的時候,可能會出現(xiàn)吞吐量上不去的情況,如下圖:

在這里插入圖片描述

到此這篇關(guān)于深入理解Spring中RabbitMQ的Channel的文章就介紹到這了,更多相關(guān)RabbitMQ的Channel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Dubbo3和Spring?Boot整合過程源碼解析

    Dubbo3和Spring?Boot整合過程源碼解析

    Dubbo首先是提供了一個單獨的模塊來和Spring Boot做整合,利用 Spring Boot自動裝配的功能,配置了一堆自動裝配的組件,本文介紹Dubbo3和Spring?Boot整合過程,需要的朋友一起看看吧
    2023-08-08
  • maven解決依賴沖突的三種解決方法

    maven解決依賴沖突的三種解決方法

    依賴沖突是指項目依賴的某一個jar包,有多個不同的版本,因而造成了包版本沖突,本文主要介紹了maven解決依賴沖突的三種解決方法,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Java中的同步非阻塞IO模型詳解

    Java中的同步非阻塞IO模型詳解

    這篇文章主要介紹了Java中的同步非阻塞IO模型詳解,同步非阻塞IO模型,我們能夠知道,用戶線程一直發(fā)送請求,內(nèi)核一直都能都夠返回 ,直到內(nèi)核完成準備數(shù)據(jù)、數(shù)據(jù)拷貝的工作,并且返回成功的指示,在此過程中用戶線程不是阻塞的狀態(tài),需要的朋友可以參考下
    2024-01-01
  • 詳解Mybatis中萬能的Map和模糊查詢寫法

    詳解Mybatis中萬能的Map和模糊查詢寫法

    這篇文章主要介紹了Mybatis中萬能的Map和模糊查詢寫法的相關(guān)資料,幫助大家更好的理解和使用Mybatis,感興趣的朋友可以了解下
    2021-03-03
  • Java實現(xiàn)特定范圍的完數(shù)輸出算法示例

    Java實現(xiàn)特定范圍的完數(shù)輸出算法示例

    這篇文章主要介紹了Java實現(xiàn)特定范圍的完數(shù)輸出算法,簡單說明了完數(shù)的概念、計算原理并結(jié)合實例形式分析了java針對給定范圍內(nèi)的完數(shù)輸出操作實現(xiàn)技巧,需要的朋友可以參考下
    2017-12-12
  • java對xml節(jié)點屬性的增刪改查實現(xiàn)方法

    java對xml節(jié)點屬性的增刪改查實現(xiàn)方法

    下面小編就為大家?guī)硪黄猨ava對xml節(jié)點屬性的增刪改查實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 在已有spring的基礎(chǔ)上集成hibernate的實例講解

    在已有spring的基礎(chǔ)上集成hibernate的實例講解

    下面小編就為大家?guī)硪黄谝延衧pring的基礎(chǔ)上集成hibernate的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 解決無法解析javax.servlet的方法

    解決無法解析javax.servlet的方法

    最近在創(chuàng)建一個servlet時,自動生成的代碼中出現(xiàn)servlet無法解析的提示,令我無法正常使用servlet里的方法,在對各個步驟進行查看后,發(fā)現(xiàn)了問題所在,需要的朋友可以參考下
    2021-05-05
  • java開發(fā)CPU流水線與指令亂序執(zhí)行詳解

    java開發(fā)CPU流水線與指令亂序執(zhí)行詳解

    這篇文章主要為大家介紹了java開發(fā)CPU流水線與指令亂序執(zhí)行詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Springboot mybatis常見配置問題解決

    Springboot mybatis常見配置問題解決

    這篇文章主要介紹了Springboot mybatis常見配置問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11

最新評論