最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解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ā)的去訪問(wèn)同一個(gè) channel 會(huì)出問(wèn)題。

這里有幾種處理方式:

  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è)并不是說(shuō),這個(gè)連接里只能最多創(chuàng)建25個(gè) channel ,而是說(shuō)最多緩存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)然我們也不能說(shuō)有多少并發(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 住。做了壓力測(cè)試,并發(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)文章

  • IDEA解決springboot熱部署失效問(wèn)題(推薦)

    IDEA解決springboot熱部署失效問(wèn)題(推薦)

    熱部署,就是在應(yīng)用正在運(yùn)行的時(shí)候升級(jí)軟件,卻不需要重新啟動(dòng)應(yīng)用。這篇文章主要介紹了IDEA解決springboot熱部署失效問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java中StringBuffer和StringBuilder_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java中StringBuffer和StringBuilder_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    StringBuffer、StringBuilder和String一樣,也用來(lái)代表字符串。String類是不可變類,StringBuffer則是可變類,任何對(duì)它所指代的字符串的改變都不會(huì)產(chǎn)生新的對(duì)象。本文重點(diǎn)給大家介紹String、StringBuffer、StringBuilder區(qū)別,感興趣的朋友一起看看吧
    2017-04-04
  • spring boot在啟動(dòng)項(xiàng)目之后執(zhí)行的實(shí)現(xiàn)方法

    spring boot在啟動(dòng)項(xiàng)目之后執(zhí)行的實(shí)現(xiàn)方法

    在開發(fā)時(shí)有時(shí)候需要在整個(gè)應(yīng)用開始運(yùn)行時(shí)執(zhí)行一些特定代碼,比如初始化環(huán)境,下面這篇文章就來(lái)給大家介紹了關(guān)于spring boot在啟動(dòng)項(xiàng)目之后執(zhí)行自己要執(zhí)行的東西的實(shí)現(xiàn)方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下。
    2017-09-09
  • 使用Spring?Boot的原因解析

    使用Spring?Boot的原因解析

    Spring Boot是Spring家族的成員,它是一個(gè)全新的框架,它的設(shè)計(jì)目的是盡可能簡(jiǎn)單和快速的開發(fā)、運(yùn)行Spring應(yīng)用程序,簡(jiǎn)化配置,這篇文章主要介紹了為什么使用Spring?Boot,需要的朋友可以參考下
    2022-07-07
  • 消息隊(duì)列-kafka消費(fèi)異常問(wèn)題

    消息隊(duì)列-kafka消費(fèi)異常問(wèn)題

    這篇文章主要給大家介紹了關(guān)于kafka的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Spring MVC學(xué)習(xí)之DispatcherServlet請(qǐng)求處理詳析

    Spring MVC學(xué)習(xí)之DispatcherServlet請(qǐng)求處理詳析

    這篇文章主要給大家介紹了關(guān)于Spring MVC學(xué)習(xí)教程之DispatcherServlet請(qǐng)求處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 詳解SpringBoot讀取resource目錄下properties文件的常見方式

    詳解SpringBoot讀取resource目錄下properties文件的常見方式

    這篇文章主要介紹了SpringBoot讀取resource目錄下properties文件的常見方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • JDK8 HashMap紅黑樹退化為鏈表的機(jī)制方式

    JDK8 HashMap紅黑樹退化為鏈表的機(jī)制方式

    這篇文章主要介紹了JDK8 HashMap紅黑樹退化為鏈表的機(jī)制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(概要分析)

    Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(概要分析)

    這篇文章主要為大家詳細(xì)介紹了Java并發(fā)系列之AbstractQueuedSynchronizer源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Spring-Data-JPA整合MySQL和配置的方法

    Spring-Data-JPA整合MySQL和配置的方法

    這篇文章主要介紹了Spring Data JPA整合MySQL和配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04

最新評(píng)論

徐州市| 兰州市| 永新县| 海伦市| 阳朔县| 淮安市| 西乌珠穆沁旗| 辽宁省| 库伦旗| 苍山县| 大方县| 龙口市| 丽水市| 花莲县| 中江县| 绍兴县| 延吉市| 彭山县| 阿瓦提县| 东兰县| 锡林浩特市| 车险| 房产| 应用必备| 呼和浩特市| 肥乡县| 南靖县| 吴桥县| 胶南市| 新巴尔虎左旗| 河津市| 石泉县| 当雄县| 富平县| 改则县| 辛集市| 淮阳县| 奇台县| 石屏县| 宜州市| 忻城县|