訊息游標
訊息游標
在 ActiveMQ Classic 的先前版本中,一個常見的問題是使用非持久性訊息時,RAM 緩衝區耗盡。
從 ActiveMQ Classic 5.0.0 開始,有一個新的記憶體模型,允許在空間可用時從儲存體中分頁讀取訊息(對持久性訊息使用儲存游標)。
5.0 之前的版本會將所有可分派到活動的持久性主題消費者或佇列的訊息的參考保存在記憶體中。雖然參考本身不大,但它確實限制了可掛起傳遞的最大訊息數。
訊息系統分派持久性訊息的典型方法是,當客戶端準備好使用它們時,使用游標維護下一個分派位置,從長期儲存中批量提取它們。這是一種穩健且非常可擴展的方法,但對於消費者可以跟上訊息生產者的情況來說,並非效能最佳。
ActiveMQ Classic 5.0 採用混合方法,允許訊息直接從生產者傳遞到消費者(在訊息持久化之後),但如果消費者落後,則切換回使用游標。
當訊息消費者既活躍又快速時 - 跟上訊息生產者
如果消費者在訊息從儲存體掛起後才變為活動狀態,或者比生產者慢,則會從掛起的游標中將訊息分頁到分派佇列中
游標的類型
ActiveMQ Classic 5.0 中的預設訊息游標類型是基於儲存的。它的行為如上所述。還有兩種額外的游標類型可以使用:VM 游標和基於檔案的游標,如下所述。
VM 游標
VM 游標是 ActiveMQ Classic 4.x 的工作方式:訊息的參考保存在記憶體中,並在需要時傳遞到分派佇列。這可能非常快,但也有無法處理非常慢的消費者或長時間不活躍的消費者的缺點:
基於檔案的游標
基於檔案的游標是從 VM 游標衍生而來。當 Broker 中的記憶體達到其限制時,它可以將訊息分頁到磁碟上的暫存檔。當訊息儲存可能相對較慢,但消費者通常很快時,可以使用這種游標。透過緩衝到磁碟,它允許訊息 Broker 處理來自生產者的訊息突發,而無需從慢速儲存中分頁讀取
非持久性訊息的分頁
基於儲存的游標也處理非持久性訊息的游標,這些訊息不會儲存在訊息儲存中。非持久性訊息直接傳遞到游標,因此基於儲存的游標僅針對這些類型的訊息嵌入基於檔案的游標
設定游標
預設情況下,使用基於儲存的游標,但可以根據目的地設定不同的游標。
主題訂閱者
對於主題,每個訂閱者都有一個分派佇列和掛起的游標。可以為持久性訂閱者和臨時訂閱者設定不同的原則 - 例如
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic="org.apache.>" producerFlowControl="false" memoryLimit="1mb">
<dispatchPolicy>
<strictOrderDispatchPolicy />
</dispatchPolicy>
<deadLetterStrategy>
<individualDeadLetterStrategy topicPrefix="Test.DLQ." />
</deadLetterStrategy>
<pendingSubscriberPolicy>
<vmCursor />
</pendingSubscriberPolicy>
<pendingDurableSubscriberPolicy>
<vmDurableCursor/>
</pendingDurableSubscriberPolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
有效的訂閱者類型是 vmCursor 和 fileCursor。預設值是基於儲存的游標。
有效的持久性訂閱者游標類型是 storeDurableSubscriberCursor、vmDurableCursor 和 fileDurableSubscriberCursor。預設值是基於儲存的游標
佇列
對於佇列,每個目的地都有一個單一的分派佇列和掛起的佇列,因此設定略有不同
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue="org.apache.>">
<deadLetterStrategy>
<individualDeadLetterStrategy queuePrefix="Test.DLQ."/>
</deadLetterStrategy>
<pendingQueuePolicy>
<vmQueueCursor />
</pendingQueuePolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
有效的佇列游標類型是 storeCursor、vmQueueCursor 和 fileQueueCursor。預設值是基於儲存的游標