簡體   English   中英

服務結構可靠的收集和不變性

[英]Service fabric reliable collections and immutability

我在這里閱讀文章https://azure.microsoft.com/en-in/documentation/articles/service-fabric-work-with-reliable-collections/它說:“一旦給定對象,就不得修改對象到可靠的收藏。”

為什么會這樣? 我可以不修改對象並將其添加回可靠的集合嗎? 它不會覆蓋以前的值嗎?

從理論上講,您可以修改同一對象並將其寫回到可靠的集合中。 但是這種方法是有缺陷的。 對對象進行更改時,該值僅在本地修改,不會寫入主副本和輔助副本的磁盤。 直到您將修改后的對象顯式寫回到可靠的集合中,該對象的本地副本和持久性副本才不會相同。 因此,將對象視為不可變並修改對象的深層副本始終是一個好習慣。

在傳統的.net集合中,來自字典中的鍵控查找的Value(或來自隊列的pop / peek)返回指向堆上對象的指針。 修改此指針時,將修改堆中的值。 結果,狀態在字典中發生了變化。

可靠的收藏是復雜得多的交互的基礎。 盡管集合確實在內存中*,但可靠的狀態管理器還負責將任何更改復制到輔助副本。 發生這種情況的機制是在ITransaction上調用CommitAsync。

如果僅更改對象的內存表示形式,則更改將永遠不會復制到輔助分區,並且會導致未定義/意外行為。 (例如,當活動主數據庫切換到輔助數據庫時)(如果您執行CommitAsync(即使您執行Get-> Modify-> Set),則事務可能無法提交,並且內存中的當前表示將與輔助數據庫不同分區以及主分區在磁盤上的表示形式。 再次,這將導致未定義/意外的行為。

*在大多數情況下,除非集合的大小大於可用內存。 在這種情況下,這些值是從磁盤分頁的,並且只有鍵和最近使用的值才會保留在內存中。 將來,我會聽到有關磁盤壓力增加時進一步分頁到Blob存儲的討論。

完整的聲明是:

但是,對於可靠的集合,此代碼存在與已討論的問題相同的問題:將對象賦予可靠的集合后,您一定不能修改它。

該聲明是針對與可靠集合相關的問題。 使用SF可靠字典時,API看起來像標准的.NET字典。 在幕后,它的作用更像是管理狀態。 通過這種差異,在使用這些數據結構時,我們需要牢記常見的陷阱。 在第一個代碼演示中,它將看起來像將更新對象,但不會。 在本文的后面,它為您提供了修改可靠集合中對象的正確方法。

暫無
暫無

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

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