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

基于rocketmq的有序消費(fèi)模式和并發(fā)消費(fèi)模式的區(qū)別說明

 更新時間:2021年06月22日 10:18:59   作者:從心歸零  
這篇文章主要介紹了基于rocketmq的有序消費(fèi)模式和并發(fā)消費(fèi)模式的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

rocketmq消費(fèi)者注冊監(jiān)聽有兩種模式

有序消費(fèi)MessageListenerOrderly和并發(fā)消費(fèi)MessageListenerConcurrently,這兩種模式返回值不同。

MessageListenerOrderly

正確消費(fèi)返回

ConsumeOrderlyStatus.SUCCESS

稍后消費(fèi)返回

ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT
MessageListenerConcurrently

正確消費(fèi)返回

ConsumeConcurrentlyStatus.CONSUME_SUCCESS

稍后消費(fèi)返回

ConsumeConcurrentlyStatus.RECONSUME_LATER

顧名思義,有序消費(fèi)模式是按照消息的順序進(jìn)行消費(fèi),但是除此之外,在實(shí)踐過程中我發(fā)現(xiàn)和并發(fā)消費(fèi)模式還有很大的區(qū)別的。

第一,速度,下面我打算用實(shí)驗(yàn)來探究一下。

使用mq發(fā)送消息,消費(fèi)者使用有序消費(fèi)模式消費(fèi),具體的業(yè)務(wù)是阻塞100ms

Long totalTime = 0L;
Date date1 = null;
Date date2 = new Date();
new MessageListenerOrderly() { 
	@Override
	public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs,
			ConsumeOrderlyContext context) {
        logger.info("==========CONSUME_START===========");  
		logger.info(Thread.currentThread().getName()  
                            + " Receive New Messages: " + msgs.size());  
        try {
        	if(date1 == null)
        		date1 = new Date();//在第一次消費(fèi)時初始化
        	Thread.sleep(100);
       		logger.info("total:"+(++total));
        	date2 = new Date();
       		totalTime = (date2.getTime() - date1.getTime());
       		logger.info("totalTime:"+totalTime);
            logger.info("==========CONSUME_SUCCESS===========");  
            return ConsumeOrderlyStatus.SUCCESS;  
        }catch (Exception e) {
            logger.info("==========RECONSUME_LATER===========");  
            logger.error(e.getMessage(),e);
            return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;
        }
	}
}

消費(fèi)100條消息

速度挺快的,為了讓結(jié)果更準(zhǔn)確,將消息加到1000條

消費(fèi)1000條消息

可以看到每一條消息平均耗時25ms,然而業(yè)務(wù)是阻塞100ms,這說明有序消費(fèi)模式和同步消費(fèi)可能并不是一回事,那如果不阻塞代碼我們再來看一下結(jié)果

不阻塞過后速度明顯提高了,那么我阻塞300ms會怎么樣呢?

時間相比阻塞100ms多了2倍

接下來我們測試并發(fā)消費(fèi)模式

Long totalTime = 0L;
Date date1 = null;
Date date2 = new Date();
new MessageListenerConcurrently() {
    public ConsumeConcurrentlyStatus consumeMessage(  
                       List< MessageExt > msgs, ConsumeConcurrentlyContext context) {  
 
    		logger.info(Thread.currentThread().getName()  
                                 + " Receive New Messages: " + msgs.size()); 
    		try {
    			if(date1 == null)
    				date1 = new Date();
            	Thread.sleep(100);
           		logger.info("total:"+(++total));
           		date2 = new Date();
           		totalTime = (date2.getTime() - date1.getTime());
           		logger.info("totalTime:"+totalTime);
                logger.info("==========CONSUME_SUCCESS===========");  
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;  
            } catch (Exception e) {
                logger.info("==========RECONSUME_LATER===========");  
                logger.error(e.getMessage(),e);
                return ConsumeConcurrentlyStatus.RECONSUME_LATER;
            }
    }  
}

基于上次的經(jīng)驗(yàn),同樣測試三種情況,消費(fèi)1000條不阻塞,消費(fèi)1000條阻塞100ms,消費(fèi)1000條阻塞300ms

消費(fèi)1000條不阻塞的情況

和有序消費(fèi)模式差不多,快個一兩秒。

消費(fèi)1000條阻塞100ms

竟然比不阻塞的情況更快,可能是誤差把

消費(fèi)1000條阻塞300ms

速度稍慢,但是還是比有序消費(fèi)快得多。

結(jié)論是并發(fā)消費(fèi)的消費(fèi)速度要比有序消費(fèi)更快。

另一個區(qū)別是消費(fèi)失敗時的處理不同,有序消費(fèi)模式返回ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT后,消費(fèi)者會立馬消費(fèi)這條消息,而使用并發(fā)消費(fèi)模式,返回ConsumeConcurrentlyStatus.RECONSUME_LATER后,要過好幾秒甚至十幾秒才會再次消費(fèi)。

我是在只有一條消息的情況下測試的。更重要的區(qū)別是,

返回ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT并不會增加消息的消費(fèi)次數(shù),mq消息有個默認(rèn)最大消費(fèi)次數(shù)16,消費(fèi)次數(shù)到了以后,這條消息會進(jìn)入死信隊(duì)列,這個最大消費(fèi)次數(shù)是可以在mqadmin中設(shè)置的。

mqadmin updateSubGroup -n 127.0.0.1:9876 -c DefaultCluster -g MonitorCumsumerGroupName -r 3

我測試后發(fā)現(xiàn),并發(fā)模式下返回ConsumeConcurrentlyStatus.RECONSUME_LATER,同一個消息到達(dá)最大消費(fèi)次數(shù)之后就不會再出現(xiàn)了。這說明有序消費(fèi)模式可能并沒有這個機(jī)制,這意味著你再有序消費(fèi)模式下拋出固定異常,那么這條異常信息將會被永遠(yuǎn)消費(fèi),并且很可能會影響之后正常的消息。下面依然做個試驗(yàn)

Map<String, Integer> map = new HashMap<>();//保存消息錯誤消費(fèi)次數(shù)
new MessageListenerOrderly() {
 
	@Override
	public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs,
			ConsumeOrderlyContext context) {
        try {
        	if(1 == 1)
        			throw new Exception();
            return ConsumeOrderlyStatus.SUCCESS;  
        }catch (Exception e) {
        	MessageExt msg = msgs.get(0);
			if(map.containsKey(msg.getKeys())) {//消息每消費(fèi)一次,加1
			    map.put(msg.getKeys(), map.get(msg.getKeys()) + 1);
			}else {
			    map.put(msg.getKeys(), 1);
			}
			logger.info(msg.getKeys()+":"+map.get(msg.getKeys()));
            return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;
        }
	}	
}

發(fā)送了十條消息

可以看到雖然我發(fā)了十條消息,但是一直在消費(fèi)同樣四條消息,這可能跟消息broker有默認(rèn)四條隊(duì)列有關(guān)系。同時從時間可以看到,消費(fèi)失敗后,會馬上拉這條信息。

至于并發(fā)消費(fèi)模式則不會無限消費(fèi),而且消費(fèi)失敗后不會馬上再消費(fèi)。具體的就不嘗試了。

結(jié)論是有序消費(fèi)模式MessageListenerOrderly要慎重地處理異常,我則是用全局變量記錄消息的錯誤消費(fèi)次數(shù),只要消費(fèi)次數(shù)達(dá)到一定次數(shù),那么就直接返回ConsumeOrderlyStatus.SUCCESS。

突然想到之前測試有序消費(fèi)模式MessageListenerOrderly的時候?yàn)槭裁?000條消息阻塞100ms耗時25000ms了,因?yàn)橛行蛳M(fèi)模式是同時拉取四條隊(duì)列消息的,這就對上了。

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java核心庫實(shí)現(xiàn)AOP過程

    Java核心庫實(shí)現(xiàn)AOP過程

    給大家分享一下利用Java核心庫實(shí)現(xiàn)簡單的AOP的經(jīng)驗(yàn)分享和教學(xué),需要的讀者們參考下吧。
    2017-12-12
  • 淺談關(guān)于Java正則和轉(zhuǎn)義中\(zhòng)\和\\\\的理解

    淺談關(guān)于Java正則和轉(zhuǎn)義中\(zhòng)\和\\\\的理解

    這篇文章主要介紹了淺談關(guān)于Java正則和轉(zhuǎn)義中\(zhòng)\和\\\\的理解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 簡單講解Java的Future編程模式

    簡單講解Java的Future編程模式

    這篇文章主要介紹了Java的Future編程模式,包括對異步和并發(fā)的一些設(shè)計(jì)思維,需要的朋友可以參考下
    2015-11-11
  • Java RandomAccessFile的用法詳解

    Java RandomAccessFile的用法詳解

    下面小編就為大家?guī)硪黄狫ava RandomAccessFile的用法詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • SpringMVC Cron定時器Demo常見問題解決方案

    SpringMVC Cron定時器Demo常見問題解決方案

    這篇文章主要介紹了SpringMVC Cron定時器Demo常見問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法

    Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法

    這篇文章主要介紹了Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • macOS中搭建Java8開發(fā)環(huán)境(基于Intel?x86?64-bit)

    macOS中搭建Java8開發(fā)環(huán)境(基于Intel?x86?64-bit)

    這篇文章主要介紹了macOS中搭建Java8開發(fā)環(huán)境(基于Intel?x86?64-bit)?的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • JUnit4 Hamcrest匹配器常用方法總結(jié)

    JUnit4 Hamcrest匹配器常用方法總結(jié)

    這篇文章主要介紹了JUnit4 Hamcrest匹配器常用方法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Idea集成ApiFox插件及使用小結(jié)

    Idea集成ApiFox插件及使用小結(jié)

    本文介紹了如何使用Apifox和IntelliJ IDEA插件來整理和生成接口文檔,包括配置Apifox和IntelliJ IDEA插件、代碼案例以及使用方法,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Log4j2?重大漏洞編譯好的log4j-2.15.0.jar包下載(替換過程)

    Log4j2?重大漏洞編譯好的log4j-2.15.0.jar包下載(替換過程)

    Apache?開源項(xiàng)目?Log4j?的遠(yuǎn)程代碼執(zhí)行漏洞細(xì)節(jié)被公開,由于?Log4j?的廣泛使用,該漏洞一旦被攻擊者利用會造成嚴(yán)重危害,下面小編給大家?guī)砹薒og4j2?重大漏洞編譯好的log4j-2.15.0.jar包下載,感興趣的朋友一起看看吧
    2021-12-12

最新評論

石首市| 门头沟区| 连城县| 乐东| 中阳县| 永嘉县| 无为县| 嘉义县| 大关县| 武安市| 马关县| 女性| 尉犁县| 日喀则市| 新安县| 沛县| 绍兴县| 小金县| 常德市| 鄯善县| 通州市| 定州市| 洛阳市| 永吉县| 长武县| 顺平县| 嵊州市| 中方县| 临沧市| 阜康市| 武威市| 门源| 资兴市| 措美县| 晋宁县| 紫云| 饶河县| 平潭县| 攀枝花市| 汪清县| 阜新|