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

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

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

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

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

MessageListenerOrderly

正確消費返回

ConsumeOrderlyStatus.SUCCESS

稍后消費返回

ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT
MessageListenerConcurrently

正確消費返回

ConsumeConcurrentlyStatus.CONSUME_SUCCESS

稍后消費返回

ConsumeConcurrentlyStatus.RECONSUME_LATER

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

第一,速度,下面我打算用實驗來探究一下。

使用mq發(fā)送消息,消費者使用有序消費模式消費,具體的業(yè)務是阻塞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();//在第一次消費時初始化
        	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;
        }
	}
}

消費100條消息

速度挺快的,為了讓結果更準確,將消息加到1000條

消費1000條消息

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

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

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

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

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)驗,同樣測試三種情況,消費1000條不阻塞,消費1000條阻塞100ms,消費1000條阻塞300ms

消費1000條不阻塞的情況

和有序消費模式差不多,快個一兩秒。

消費1000條阻塞100ms

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

消費1000條阻塞300ms

速度稍慢,但是還是比有序消費快得多。

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

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

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

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

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

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

Map<String, Integer> map = new HashMap<>();//保存消息錯誤消費次數(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())) {//消息每消費一次,加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ā)了十條消息,但是一直在消費同樣四條消息,這可能跟消息broker有默認四條隊列有關系。同時從時間可以看到,消費失敗后,會馬上拉這條信息。

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

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

突然想到之前測試有序消費模式MessageListenerOrderly的時候為什么1000條消息阻塞100ms耗時25000ms了,因為有序消費模式是同時拉取四條隊列消息的,這就對上了。

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

相關文章

  • Springboot框架實現(xiàn)自動裝配詳解

    Springboot框架實現(xiàn)自動裝配詳解

    在使用springboot時,很多配置我們都沒有做,都是springboot在幫我們完成,這很大一部分歸功于springboot自動裝配。本文將詳細為大家講解SpringBoot的自動裝配原理,需要的可以參考一下
    2022-08-08
  • 一篇文章帶你入門Java封裝

    一篇文章帶你入門Java封裝

    Java面向對象的三大特性:封裝、繼承、多態(tài)。下面對三大特性之一封裝進行了總結,需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08
  • SpringBoot使用Validator進行參數(shù)校驗實戰(zhàn)教程(自定義校驗,分組校驗)

    SpringBoot使用Validator進行參數(shù)校驗實戰(zhàn)教程(自定義校驗,分組校驗)

    這篇文章主要介紹了SpringBoot使用Validator進行參數(shù)校驗(自定義校驗,分組校驗)的實戰(zhàn)教程,本文通過示例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2023-07-07
  • Java 獲取原始請求域名實現(xiàn)示例

    Java 獲取原始請求域名實現(xiàn)示例

    這篇文章主要為大家介紹了Java 獲取原始請求域名實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Java設計模式之簡單工廠 工廠方法 抽象工廠深度總結

    Java設計模式之簡單工廠 工廠方法 抽象工廠深度總結

    設計模式(Design Pattern)是前輩們對代碼開發(fā)經(jīng)驗的總結,是解決特定問題的一系列套路。它不是語法規(guī)定,而是一套用來提高代碼可復用性、可維護性、可讀性、穩(wěn)健性以及安全性的解決方案
    2021-09-09
  • Spring BeanUtils忽略空值拷貝的方法示例代碼

    Spring BeanUtils忽略空值拷貝的方法示例代碼

    本文用示例介紹Spring(SpringBoot)如何使用BeanUtils拷貝對象屬性忽略空置,忽略null值拷貝屬性的用法,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-03-03
  • 淺談springboot一個service內(nèi)組件的加載順序

    淺談springboot一個service內(nèi)組件的加載順序

    這篇文章主要介紹了springboot一個service內(nèi)組件的加載順序,具有很好的參考價值,希望對大家有所幫助。以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家
    2021-08-08
  • Java編程實現(xiàn)springMVC簡單登錄實例

    Java編程實現(xiàn)springMVC簡單登錄實例

    這篇文章主要介紹了Java編程實現(xiàn)springMVC簡單登錄實例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • mybatis-plus中更新null值的問題解決

    mybatis-plus中更新null值的問題解決

    本文主要介紹 mybatis-plus 中常使用的 update 相關方法的區(qū)別,以及更新 null 的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-04-04
  • spring-core組件詳解——PropertyResolver屬性解決器

    spring-core組件詳解——PropertyResolver屬性解決器

    這篇文章主要介紹了spring-core組件詳解——PropertyResolver屬性解決器,需要的朋友可以參考下
    2016-05-05

最新評論