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 的独占消费模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试中回答离职原因的万能公式
- 下一篇: 最短路径 的一些解法和特殊情况