ActiveMQ 中的訊息遊標(Message cursors)
在Activemq以前的版本中,broker會把待傳送的訊息儲存在記憶體中。這種方式的缺陷是當消費者消費的速度趕不上生產者的速度時,會在broker的記憶體中積攢大量的訊息,當達到一個限額後,broker就不再接收訊息。這時生產者就被阻塞了,直到broker將記憶體清理能儲存訊息後才能繼續傳送。
在5.0版本後,Activemq實現了一種新的記憶體模型來防止慢消費者阻塞快速生產者。通常訊息在未發生或者傳送後未收到消費者的確認資訊時都會持久儲存訊息到儲存中。當有消費者來可以消費訊息時,broker會批量從儲存中取出訊息,傳送給消費者。遊標就是指向下次批量獲取訊息時的儲存位置。
根據遊標的儲存方式不同,可分為三種:
Store-based cursors
broker預設採用的遊標。它將遊標資訊儲存在儲存中。針對速度不同的消費者,這種遊標機制採取的方式不同。對於快速消費者,因為消費速度很快,儲存中的訊息數量會很少,所以不需要遊標。這時,訊息傳送到broker時,先儲存在持久儲存中,然後直接傳送給了消費者。而對於慢消費者,訊息的持久儲存中會儲存大量的訊息,所以需要使用遊標來指定下一次批量讀取訊息的位置。
VM cursors
若消費者能跟上生產者生產的速度,這時持久儲存中訊息雖然不是很多,但是若能也能在記憶體中儲存一些遊標,對獲取儲存中的訊息的效能會有很大的提升。
File-based cursors
對VM cursors 的一種改進。當記憶體中的遊標達到一定限額後,就會將一些遊標儲存到臨時檔案中。
Activemq預設使用store-based遊標。當然也可為不同的Destination修改遊標策略。通過修改destinationPolicy節點來更改預設配置。destinationPolicy節點包含多ge policyMap節點。policyMap包含一個policyEntries節點,policyEntries節點包含多個policyEntry 節點。policyEntry 就是具體的一個遊標策略了。Topics的消費者分為持久訂閱者和臨時訂閱者,所以有兩套配置。Queues只有一類消費者,所以只有一套配置。對於持久訂閱者可以使用PendingDurableSubscriberMessageStoragePolicy來指定遊標策略。可配置的策略有vmDurableCursor和fileDurableSubscriberCursor.
對於臨時訂閱者可以使用pendingSubscriberPolicy 來指定。可配置的策略有vmCursor和fileCursor。下面是關於Topics的一些xml配置:
Queues 同樣也有vm和file兩種型別的遊標儲存策略。pendingQueuePolicy 節點的可配置子節點有vmQueueCursor和fileQueueCursor
在5.0版本後,Activemq實現了一種新的記憶體模型來防止慢消費者阻塞快速生產者。通常訊息在未發生或者傳送後未收到消費者的確認資訊時都會持久儲存訊息到儲存中。當有消費者來可以消費訊息時,broker會批量從儲存中取出訊息,傳送給消費者。遊標就是指向下次批量獲取訊息時的儲存位置。
根據遊標的儲存方式不同,可分為三種:
Store-based cursors
broker預設採用的遊標。它將遊標資訊儲存在儲存中。針對速度不同的消費者,這種遊標機制採取的方式不同。對於快速消費者,因為消費速度很快,儲存中的訊息數量會很少,所以不需要遊標。這時,訊息傳送到broker時,先儲存在持久儲存中,然後直接傳送給了消費者。而對於慢消費者,訊息的持久儲存中會儲存大量的訊息,所以需要使用遊標來指定下一次批量讀取訊息的位置。
VM cursors
若消費者能跟上生產者生產的速度,這時持久儲存中訊息雖然不是很多,但是若能也能在記憶體中儲存一些遊標,對獲取儲存中的訊息的效能會有很大的提升。
File-based cursors
對VM cursors 的一種改進。當記憶體中的遊標達到一定限額後,就會將一些遊標儲存到臨時檔案中。
Activemq預設使用store-based遊標。當然也可為不同的Destination修改遊標策略。通過修改destinationPolicy節點來更改預設配置。destinationPolicy節點包含多ge policyMap節點。policyMap包含一個policyEntries節點,policyEntries節點包含多個policyEntry 節點。policyEntry 就是具體的一個遊標策略了。Topics的消費者分為持久訂閱者和臨時訂閱者,所以有兩套配置。Queues只有一類消費者,所以只有一套配置。對於持久訂閱者可以使用PendingDurableSubscriberMessageStoragePolicy來指定遊標策略。可配置的策略有vmDurableCursor和fileDurableSubscriberCursor.
對於臨時訂閱者可以使用pendingSubscriberPolicy 來指定。可配置的策略有vmCursor和fileCursor。下面是關於Topics的一些xml配置:
- <beans ... >
- <broker ...>
- ...
- <destinationPolicy>
- <policyMap>
- <policyEntries>
- <policyEntry topic="com.iona.>">
- ...
- <pendingSubscriberPolicy>
- <vmCursor />
- </pendingSubscriberPolicy>
- <PendingDurableSubscriberMessageStoragePolicy>
- <fileDurableSubscriberPolicy />
- </PendingDurableSubscriberMessageStoragePolicy>
- ...
- </policyEntry>
- ...
- </policyEntries>
- </policyMap>
- </destinationPolicy>
- ...
- </broker>
- ...
- </beans>
Queues 同樣也有vm和file兩種型別的遊標儲存策略。pendingQueuePolicy 節點的可配置子節點有vmQueueCursor和fileQueueCursor
- <beans ... >
- <broker ...>
- ...
- <destinationPolicy>
- <policyMap>
- <policyEntries>
- <policyEntry queue="com.iona.>">
- ...
- <pendingQueuePolicy>
- <vmQueueCursor />
- </pendingQueuePolicy>
- ...
- </policyEntry>
- ...
- </policyEntries>
- </policyMap>
- </destinationPolicy>
- ...
- </broker>
- ...
- </beans>
轉載: http://berdy.iteye.com/blog/814370
相關文章
- ActiveMQ支援的訊息協議MQ協議
- 訊息佇列之 ActiveMQ佇列MQ
- Tkinter (12) 訊息部件 Message
- MQTT 遺囑訊息(Will Message)的使用MQQT
- 訊息中介軟體之ActiveMQMQ
- 訊息佇列ActiveMQ的使用詳解佇列MQ
- 溫故之訊息佇列ActiveMQ佇列MQ
- unity 3種message訊息管理使用Unity
- 常見訊息中介軟體之ActiveMQMQ
- RocketMQ的事務訊息處理【half-message】MQ
- Docker學習之搭建ActiveMQ訊息服務DockerMQ
- 訊息資料庫Message DB:PostgreSQL的事件儲存和訊息儲存 - Eventide Blog資料庫SQL事件IDE
- 訊息佇列的作用以及kafka和activemq的對比佇列KafkaMQ
- RocketMQ原始碼解析之訊息消費者(consume Message)MQ原始碼
- 【FreeRtos教程三】STM32 CubeMx——Message Queue(訊息佇列)佇列
- Activemq構建高併發、高可用的大規模訊息系統MQ
- 訊息中介軟體部署及比較:rabbitMQ、activeMQ、zeroMQ、rocketMQ、Kafka、redisMQKafkaRedis
- Oracle檢視已被使用的open_cursors&session_cached_cursorsOracleSession
- Java訊息佇列總結只需一篇解決ActiveMQ、RabbitMQ、ZJava佇列MQ
- 訊息佇列中的Oracle佇列Oracle
- centos6下ActiveMQ+Zookeeper訊息中介軟體叢集部署記錄CentOSMQ
- Java訊息佇列總結只需一篇解決ActiveMQ、RabbitMQ、ZeroMQ、KafkaJava佇列MQKafka
- Java進階專題(十九) 訊息中介軟體架構體系(1)-- ActiveMQ研究Java架構MQ
- [20180822]session_cached_cursors與子游標堆0.txtSession
- RocketMQ中Producer訊息的傳送MQ
- 用程式碼理解 ObjC 中的傳送訊息和訊息轉發OBJ
- Oracle:open_cursorsOracle
- examples for oracle ref cursorsOracle
- 實戰Spring4+ActiveMQ整合實現訊息佇列(生產者+消費者)SpringMQ佇列
- Flutter中訊息傳遞Flutter
- 關於IPC-Message通訊
- Objective-C中的訊息轉發Object
- 好訊息 OR 壞訊息
- 聊聊Postgres中的IPC之SI Message Queue
- Fanuc Socket Message通訊第一講
- RabbitMq中的訊息應答與持久化MQ持久化
- 利用redis的hash結構搭建訊息服務(發訊息,訂閱訊息,消費訊息,退訂)Redis
- (原創) odoo17中在訊息主題(mail.thread)中傳送訊息時,是否通知訊息作者進行控制OdooAIthread
- 網易來聊聊子彈簡訊的訊息漫遊技術