簡體   English   中英

MSR Orleans - 如何使用並行讀取創建讀寫器粒度

[英]MSR Orleans - How to create a reader-writer grain with parallel reads

我需要一個讀寫器粒子(s?)來保存一些值,以便系統的其他部分可以頻繁地並行地引用它們。

我所追求的是存儲一些系統范圍的配置值,這些配置值經常被訪問,並且可能會發生變化,但非常罕見(最多每月一次)。 系統應該可以重新配置,無需停機。 我目前正在考慮的是將數據存儲在某個數據庫中。 然后它將在silo啟動時讀取,並且會有一個特殊的回調函數,在外部更改后再次讀取數據。 我不想每次需要時都從數據庫中讀取數據,因為:

  • 它會在孤島內部創建不必要的處理開銷,因為必須處理和過濾掉一些數據。
  • 它會增加數據庫的負載,我不能保證在處理高負載時會像silo環境一樣好。
  • 在更新之前,數據由筒倉環境進行驗證。 直接從數據庫中讀取意味着當操作員更新並修復新數據時,將沒有中間層來保存最后已知的有效數據。

我可以輕松地創建一個讀寫器鎖定的內存數據存儲,但奧爾良的單線程執行策略不允許並行訪問保存數據的粒度。 我可以想到以下幾種方法來繞過這個:

  • 在多個谷物中有多個數據副本。 這顯然不是最佳的。
  • 使用靜態字段存儲數據並使谷物成為無狀態工作者。 這意味着每個孤島都有自己的數據副本(這也有助於減少網絡負載),但是沒有辦法要求每個孤島更新其數據副本(我至少知道)。

建議?

您是否看過類似智能緩存模式的內容

也許使用Reentrant grain也可以提供幫助,這將允許方法調用交錯。

我在github上發現了這個問題

我們在GitHub上找到了一個不需要基於計時器的更新的解決方案。 我將詳細解釋這里的解決方案:

  1. 有一個主谷物,負責從數據庫中讀取數據。 當配置更改時,此粒度還會接收外部UpdateConfig調用。 數據庫是“手動”更新的,所以我不在乎它是不是自動選擇更新。
  2. 每個筒倉上都有無國籍的工人緩存谷物。 這些粒子將數據存儲在靜態對象中(以幫助填充內存)並使用讀寫器鎖來管理對數據的訪問。 當第一個在筒倉上醒來時,它會更新數據,其余的只是使用該數據。 它們還支持外部UpdateConfig調用,該調用將依次向主粒子請求新數據。
  3. 有一個引導程序提供程序,它做兩件事。 首先,它在初始化時喚醒主粒度,因此數據在需要之前可用,因此我們可以避免延遲初始化打嗝。 其次,提供程序還支持控制命令(有關可控提供程序的示例,請參見此處 )。 收到此命令后,它將詢問第一個可用的緩存粒度(保證是本地的)以更新靜態對象。 這樣,數據就會在每個孤島中更新。 主粒度只是在更新其數據時發送此控制命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM