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

RabbitMQ高級應用之消費端限流策略basicQos詳解

 更新時間:2023年08月28日 10:08:26   作者:瘋狂的帆  
這篇文章主要介紹了RabbitMQ高級應用之消費端限流策略basicQos詳解,高并發(fā)情況下,隊列里面一瞬間就就積累了上萬條數(shù)據(jù),但是消費者無法同時處理這么多請求,這種場景下我們就需要對消費端進行限流,需要的朋友可以參考下

業(yè)務場景

高并發(fā)情況下,隊列里面一瞬間就就積累了上萬條數(shù)據(jù),但是消費者無法同時處理這么多請求,這個時候當我們打開客戶端,瞬間就有巨量的信息給推送過來

但是客戶端是沒有辦法同時處理這么多數(shù)據(jù)的,結果就是消費者(客戶端)掛掉了…

這種場景下我們就需要對消費端進行限流

限流策略實現(xiàn)

限流策略關鍵代碼:

channel.basicQos(); 

編寫生產(chǎn)者

// 生產(chǎn)者
public class Producer {
    private static final String QUEUE_NAME = "queue_limit_1";
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        for (int i = 0; i < 100; i++) {
            channel.basicPublish("", QUEUE_NAME, null, ("消費端限流策略—測試數(shù)據(jù):" + i).getBytes());
        }
        channel.close();
        connection.close();
    }
}

編寫消費者1

// 消費者1
public class Consumer {
    private static final String QUEUE_NAME = "queue_limit_1";
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消費者1接收到信息:" + new String(body));
                channel.basicAck(envelope.getDeliveryTag(), false);
            }
        };
        channel.basicConsume(QUEUE_NAME, false, defaultConsumer);
    }
}

編寫消費者2

// 消費者2
public class Consumer2 {
    private static final String QUEUE_NAME = "queue_limit_1";
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        /**  設置限流機制
         *  param1: prefetchSize,消息本身的大小 如果設置為0  那么表示對消息本身的大小不限制
         *  param2: prefetchCount,告訴rabbitmq不要一次性給消費者推送大于N個消息
         *  param3:global,是否將上面的設置應用于整個通道,false表示只應用于當前消費者
         */
        channel.basicQos(0, 5, false);
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消費者2接收到信息:" + new String(body));
                channel.basicAck(envelope.getDeliveryTag(), false);
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        channel.basicConsume(QUEUE_NAME, false, defaultConsumer);
    }
}

運行結果

在這里插入圖片描述

在這里插入圖片描述

小結

  1. 限流的核心代碼就是 channel.basicQos();
  2. 限流情況 ack 不能設置自動簽收,一定要手動簽收 channel.basicQos()
/**
     * @param prefetchSize maximum amount of content (measured in
     * octets) that the server will deliver, 0 if unlimited
     * @param prefetchCount maximum number of messages that the server
     * will deliver, 0 if unlimited
     * @param global true if the settings should be applied to the
     * entire channel rather than each consumer
     */
    void basicQos(int prefetchSize, int prefetchCount, boolean global) throws IOException;

該方法的作用是:進行消費端的限流

  • param1:prefetchSize,消息本身的大小 如果設置為0 那么表示對消息本身的大小不限制
  • param2:prefetchCount,告訴rabbitmq不要一次性給消費者推送大于N個消息
  • param3:global,是否將上面的設置應用于整個通道
    • false:表示只應用于當前消費者
    • true:表示當前通道的所有消費者都應用這個限流策略

到此這篇關于RabbitMQ高級應用之消費端限流策略basicQos詳解的文章就介紹到這了,更多相關RabbitMQ消費端限流策略basicQos內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java自定義Enum的實現(xiàn)示例

    Java自定義Enum的實現(xiàn)示例

    Java中的自定義Enum類型是一種特殊的類,用于表示固定數(shù)量的常量值,本文主要介紹了Java自定義Enum的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Spring Boot啟動時調用自己的非web邏輯

    Spring Boot啟動時調用自己的非web邏輯

    在spring Boot中,有些代碼是WEB功能,例如API等,但是有些邏輯是非WEB,啟動時就要調用并持續(xù)運行的,該如何加載自己的非WEB邏輯呢,下面通過實例代碼給大家講解,一起看看吧
    2017-07-07
  • Java中的線程死鎖是什么?如何避免?

    Java中的線程死鎖是什么?如何避免?

    這篇文章主要介紹了Java中線程死鎖的相關資料,以及避免死鎖的方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • 基于SpringBoot構建電商秒殺項目代碼實例

    基于SpringBoot構建電商秒殺項目代碼實例

    這篇文章主要介紹了基于SpringBoot構建電商秒殺項目代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • 詳解如何在SpringBoot中使用WebMvc

    詳解如何在SpringBoot中使用WebMvc

    Spring?Boot?是一個快速、簡單的開發(fā)框架,在?Spring?Boot?中,我們可以使用?WebMvc?來構建?Web?應用程序,所以本文就來講講如何在SpringBoot中使用WebMvc吧
    2023-06-06
  • java中不同版本JSONObject區(qū)別小結

    java中不同版本JSONObject區(qū)別小結

    本文主要介紹了java中不同版本JSONObject區(qū)別小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • Java獲取磁盤空間的兩種代碼示例

    Java獲取磁盤空間的兩種代碼示例

    這篇文章主要介紹了Java獲取磁盤空間的兩種代碼示例,沒什么事的時候可以拿來玩玩,需要的朋友參考下。
    2017-11-11
  • 基于Java8 函數(shù)式接口理解及測試

    基于Java8 函數(shù)式接口理解及測試

    下面小編就為大家?guī)硪黄贘ava8 函數(shù)式接口理解及測試。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 解決idea中yml文件圖標問題及自動提示失效的情況

    解決idea中yml文件圖標問題及自動提示失效的情況

    這篇文章主要介紹了解決idea中yml文件圖標問題及自動提示失效的情況,具有很好的價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Spring覆蓋容器中Bean的注解如何實現(xiàn)@OverrideBean

    Spring覆蓋容器中Bean的注解如何實現(xiàn)@OverrideBean

    文章介紹了在項目開發(fā)中如何通過偷梁換柱的方式重寫Spring容器中的內置Bean,并指出了需要注意的兩點:1. 對應的Bean應基于接口注入;2. 如果不是基于接口注入,可以使用同包名同類名的方式重寫(可能存在潛在問題,不推薦),文章還強調了“基于接口編程”的好處
    2025-01-01

最新評論

泰和县| 水富县| 八宿县| 长子县| 陵川县| 南宁市| 兴城市| 石门县| 姜堰市| 黎平县| 巩义市| 桦甸市| 安溪县| 上栗县| 惠水县| 崇信县| 瑞安市| 武义县| 偃师市| 霞浦县| 宜都市| 舞阳县| 淅川县| 鄂伦春自治旗| 红河县| 晋宁县| 师宗县| 团风县| 盘山县| 华池县| 东明县| 波密县| 英德市| 高平市| 祁东县| 三江| 自贡市| 石首市| 黔江区| 牡丹江市| 互助|