欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解Spring中RabbitMQ的Channel

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

概述

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

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

connection和channel的關(guān)系

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

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

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

channel線程不安全

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

這里有幾種處理方式:

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

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

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

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

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

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

connectionFactory.setChannelCheckoutTimeout(1000);

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

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

CacheMode.CHANNEL模式性能

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

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

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

在這里插入圖片描述

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

channel的監(jiān)控

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

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

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

如下圖:

在這里插入圖片描述

如果打開和關(guān)閉 channel 的速率都很高,也值得觀察一下。因?yàn)榭赡苁菦]有緩存 channel 了。

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

在這里插入圖片描述

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

    java對(duì)xml節(jié)點(diǎn)屬性的增刪改查實(shí)現(xiàn)方法

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

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

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

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

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

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

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

    Springboot mybatis常見配置問題解決

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

最新評(píng)論