日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ActiveMQ 的独占消费模式

發布時間:2025/3/15 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ActiveMQ 的独占消费模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要介紹一下ActiveMQ消息獨占模式

?

1、消息獨占模式(Exclusive Consumer)

?

Queue中的消息是按照順序被分發到consumers的。然而,當你有多個consumers同時從相同的queue中提取消息時,你將失去這個保證。因為這些消息是被多個線程并發的處理。有的時候,保證消息按照順序處理是很重要的。例如,你可能不希望在插入訂單操作結束之前執行更新這個訂單的操作。?ActiveMQ從4.x版本起開始支持Exclusive Consumer?(或者說Exclusive Queues)。?Broker會從多個consumers中挑選一個consumer來處理queue中所有的消息,從而保證了消息的有序處理。如果這個consumer失效,那么broker會自動切換到其它的consumer。 可以通過Destination Options?來創建一個Exclusive Consumer,如下:
Java代碼
1. queue = new ActiveMQQueue("TEST.QUEUE?consumer.exclusive=true");
2. consumer = session.createConsumer(queue);
順便說一下,可以給consumer設置優先級,以便針對網絡情況(如network hops)進行優化,如下:
Java代碼
1. queue = new ActiveMQQueue("TEST.QUEUE?consumer.exclusive=true &consumer.priority=10");

?

2、支持負載均衡的消息的順序消費思路

?

? ? ? ? ?(1)以一個訂單產生為例,用戶進行下單時會產生訂單,訂單生成成功,則需要減庫存等一系列操作。類似上述場景都需要消息順序高效的執行。

? ? ? ? ?(2)如果使用獨占消費者模式可以解決順序消費的問題,但是如果當訂單量非常龐大時,每次消息中間上的數據只能交給一個消費者去處理,這樣效率就會很低。

? ? ? ? ?(3)解決這個問題的思路是,可以在消息中間件(Broker)與Consumer之間添加一個集群(cluster,代理服務器角色)該集群主要目的用于將broker上的消息進行排隊,該cluster的大致設計是可以創建一個ConcurrentHashMap的隊列,隊列的key可以使用String類型的訂單ID,value可以使用一個ConcurrentLinkedQueue的隊列。這樣每次通過一些業務邏輯處理,將代理服務器的消息推送給每一個Consumer(這里的Consumer也可以是一個集群),對于每一個Consumer而言,在處理一個訂單數據時,每處理完一個訂單里的一條消息時都要將消息的返回結果通知代理服務器,代理服務器得知訂單中消息的處理情況后,就可以將同一個訂單中的第二條數據推送給另外一個Consumer,第二個Consumer的處理邏輯與第一個的相同。這樣處理方式可以保證每一個訂單的數據消息都是順序執行的。在這個期間對于第一個Cosumer而言,還可以并發處理第二個訂單中的消息。對于整個系統而言,順序處理消息的時間可能沒有特別大的變化,但是對于整個系統而言,系統的吞吐量變大了。

總結

以上是生活随笔為你收集整理的ActiveMQ 的独占消费模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。