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

解決RabbitMq消息隊列Qos?Prefetch消息堵塞問題

 更新時間:2022年01月31日 10:40:30   作者:james_searcher  
這篇文章主要為大家介紹了關于如何解決解決RabbitMq?Qos?Prefetch消息堵塞的問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助

mq是實現代碼擴展的有利手段,個人喜歡用概念來學習新知識,介紹堵塞問題的之前,先來段概念的學習。

ConnectionFactory:創(chuàng)建connection的工廠類

Connection: 簡單理解為socket

Channel:和mq交互的接口,定義queue、exchange和綁定queue、exhange等接口都是它。

接下來就是和mq的交互類

exchange:簡單地看成路由,類型不是重點,看看官網即可

queue:客戶端監(jiān)聽的是queue,而不是exchange,但是使用queue的前提要先將exchange和queue綁定。用過java queue工具類應該很容易上手,queue分為寫和讀,各自可以有自己頻率,寫得快讀得慢,容易堵塞;寫得慢讀得快又容易造成消費者的空閑。

Prefetc:一個重要卻容易被忽略的指標,也是這次遇到的問題。

prefetch與消息投遞

prefetch是指單一消費者最多能消費的unacked messages數目。

如何理解呢?

mq為每一個 consumer設置一個緩沖區(qū),大小就是prefetch。每次收到一條消息,MQ會把消息推送到緩存區(qū)中,然后再推送給客戶端。當收到一個ack消息時(consumer 發(fā)出baseack指令),mq會從緩沖區(qū)中空出一個位置,然后加入新的消息。但是這時候如果緩沖區(qū)是滿的,MQ將進入堵塞狀態(tài)。

更具體點描述,假設prefetch值設為10,共有兩個consumer。也就是說每個consumer每次會從queue中預抓取 10 條消息到本地緩存著等待消費。同時該channel的unacked數變?yōu)?0。而Rabbit投遞的順序是,先為consumer1投遞滿10個message,再往consumer2投遞10個message。如果這時有新message需要投遞,先判斷channel的unacked數是否等于20,如果是則不會將消息投遞到consumer中,message繼續(xù)呆在queue中。之后其中consumer對一條消息進行ack,unacked此時等于19,Rabbit就判斷哪個consumer的unacked少于10,就投遞到哪個consumer中。

我遇到的問題是一個粗心的程序員,在編寫代碼的時候,他對某些消息處理方式是這樣的

  if (success) {
                        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
                    } else {
                        logger.error("######### The message is not delete from queue : {}", body);
                    }

首先他講ack機制設置為手動的,然后他的理解是如果處理成功的消息,就ack給MQ,期望MQ就可以刪除完成的數據。不然,保留數據再次被處理。

這里的誤區(qū)就是就是對ack的理解,失敗的時候,如果需要讓程序繼續(xù)處理,應該使用basicNack,并告訴mq將消息再次放入隊列

    if (success) {
                            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
                        } else {
                            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
                        }

對于客戶端意外宕機的情況,沒有ack服務器確實不會刪除掉數據,但是consumer重啟以后,對于服務器就是一個新的消費者了,也就是它的緩沖區(qū)又被重置為原來的n-prefetch,所以這個問題被粗心的小哥想當然地測試通過了。

prefetch的大小應該為多少

這篇文章給了很好的建議,我簡單地說一下我的理解。

理想狀況下,計算MQ SERVER 從緩沖區(qū)中拿到消息并推送到消費端,加上消費端處理完ack消息到MQ server,的時間,假設為100ms,其中消費端處理業(yè)務話費了10ms。

這里可以得出我們 prefetch = 100ms / 10ms = 10,也就是消息來回的總時間/業(yè)務處理的時間,這里要求我們 prefetch >= 10。一般計算這個時間不會太準確只能毛姑姑的,所以prefetch一般要大一點。但是這個值也不能太大,不然消費端就一只處于空閑狀態(tài)了。

所以如果你保證所有的消息都ack了,但是還是出現比較長時間的堵塞,你就或者加大一點prefetch,或者多加一些機器,或者減少業(yè)務處理的時間了。一開始建議采用或者,使用一個線程池來處理這些業(yè)務邏輯。

以上就是解決RabbitMqQosPrefetch消息堵塞問題的詳細內容,更多關于RabbitMqQosPrefetch消息堵塞的資料請關注腳本之家其它相關文章!

相關文章

  • 總結Java常用加解密方法AES?SHA1?md5

    總結Java常用加解密方法AES?SHA1?md5

    這篇文章主要為大家介紹了Java常用加密方法AES?SHA1?md5總結及示例demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Java設計模式中代理模式應用詳解

    Java設計模式中代理模式應用詳解

    代理模式(Proxy Parttern)為一個對象提供一個替身,來控制這個對象的訪問,即通過代理對象來訪問目標對象。本文將通過示例詳細講解一下這個模式,需要的可以參考一下
    2022-11-11
  • Rocketmq事務消息之半消息詳解

    Rocketmq事務消息之半消息詳解

    這篇文章主要介紹了Rocketmq事務消息之半消息詳解,RocketMQ的事務消息支持在業(yè)務邏輯與發(fā)送消息之間提供事務保證,RocketMQ通過兩階段的方式提供事務消息的支持,需要的朋友可以參考下
    2023-09-09
  • idea顯示properties文件中文亂碼的解決方法

    idea顯示properties文件中文亂碼的解決方法

    在項目中通常會遇到如下問題,突然properties文件中文亂碼,本文主要介紹了idea顯示properties文件中文亂碼的解決方法,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Java經典快排思想以及快排的改進講解

    Java經典快排思想以及快排的改進講解

    今天小編就為大家分享一篇關于Java經典快排思想以及快排的改進講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 使用spring boot 整合kafka,延遲啟動消費者

    使用spring boot 整合kafka,延遲啟動消費者

    這篇文章主要介紹了使用spring boot 整合kafka,延遲啟動消費者的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring Boot 2.4 對多環(huán)境配置的支持更改示例代碼

    Spring Boot 2.4 對多環(huán)境配置的支持更改示例代碼

    這篇文章主要介紹了Spring Boot 2.4 對多環(huán)境配置的支持更改,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java中資源加載的方法及Spring的ResourceLoader應用小結

    Java中資源加載的方法及Spring的ResourceLoader應用小結

    在Java開發(fā)中,資源加載是一個基礎而重要的操作,這篇文章主要介紹了深入理解Java中資源加載的方法及Spring的ResourceLoader應用,本文通過實例代碼演示了通過ClassLoader和Class獲取資源的內容,以及使用Spring的ResourceLoader加載多個資源的過程,需要的朋友可以參考下
    2024-01-01
  • SpringBoot通過源碼探究靜態(tài)資源的映射規(guī)則實現

    SpringBoot通過源碼探究靜態(tài)資源的映射規(guī)則實現

    這篇文章主要介紹了SpringBoot通過源碼探究靜態(tài)資源的映射規(guī)則實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • java實現支付寶退款功能

    java實現支付寶退款功能

    這篇文章主要為大家詳細 介紹了java實現支付寶退款功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09

最新評論