持久佇列記憶體管理
開發人員 > 開發人員指南 > 設計文件 > 持久佇列記憶體管理
目前的 3.x 程式碼在處理大量未確認訊息的佇列時可能會出現問題;由於佇列中多個點的消費、消費者來來去去、選擇器僅匹配佇列中的某些點等因素,因此情況很複雜。
本頁概述了設計提案。
目標區域 (TargetArea)
為每個消費者維護 TargetList (已匹配一個或多個消費者選擇器,並將用於嘗試將內容調度到消費者 DispatchArea 的訊息)。當訊息從佇列到達時,TargetEntry 物件會被添加到 TargetList。
TargetEntry 可以有直接的 Message 參考,也可以有快取中條目的 CacheReference。
急切載入 (Eager loading)
每個 TargetList 都有一個水位標記,指示第一個是 CacheReference 的 TargetEntry。 理想情況下,每個 TargetList 的水位標記都等於高水位標記(即 RAM 中有足夠的直接訊息參考)。
因此,我們可以讓背景執行緒將水位標記增加到理想水平 - 這表示它從目前的水位標記開始,直接載入物件;取消參考 CacheReference 並替換為直接參考。
待處理快取 (PendingCache)
添加到 TargetList 中且高於高水位標記的 TargetEntry 物件,其 Message 物件會從直接參考中移除到 PendingCache 中。
當 Target 急切載入器可用時,會將物件從此快取移動到 TargetList。如果它們不在 PendingCache 中,則會從 QueueArea 載入。
佇列區域 (QueueArea)
這表示實際的佇列訊息。還有一個匹配的 HeadQueueCache,它是一個簡單的記憶體限制佇列。FIFO,因此較新的內容會從末端移除。
返回
連結快取
PendingCache 和 HeadQueueCache 與 TargetArea/DispatchArea 連結在一起,以便所有快取中使用固定數量的 RAM。
隨著 PendingCache 的增長,HeadQueueCache 會縮小。HeadQueueCache 僅用於新到達的消費者。在啟動時,它會持續存在一段時間,直到大量訊息開始傳遞給消費者,如果調度足夠,它會縮小回零。
在高負載下,除非有新的消費者出現,否則 HeadQueueCache 將幾乎為空。