復原容器數據
在此案例中,我們會探索數據復原。 我們認為當容器達到無法處理進一步使用者動作的無效狀態時,數據會損毀。 損毀狀態的結果是容器意外關閉。 通常是暫時性狀態,而且重新開啟時,容器的行為可能會如預期般運作。 在容器在多次重試之後仍無法載入的情況下,我們提供可用來復原數據的 API 和流程,如下所述。
如何 流體架構 和 Azure Fluid Relay 儲存狀態
流體架構 會定期將數據快照集儲存在容器中,以匯總對數據所做的所有變更,到該點為止。 在正常載入期間,會擷取最新的快照集,並在該狀態之上套用任何後續的變更。
如果最新的快照集或後續變更已損毀,Fluid 可能無法正常載入它們。 在此情況下,Fluid 會提供 API 集合來檢視儲存的快照集版本,並以僅限檢視模式載入它們,且不會套用後續的變更。 這可讓數據擷取並選擇性地插入新的容器,以繼續共同作業。
Azure 用戶端 API
用於檢視和載入容器版本的 API
AzureClient 有下列方法來支援此案例:
取得容器版本
getContainerVersions(id, options?)
擷取可能從載入的可用版本清單。
Parameters:
id
:容器標識碼。 這是呼叫getContainer
時所使用的相同標識碼。options?
:選擇性地指定選項物件:maxCount
:要擷取的版本數目上限。 如果有比要求更多的版本可用,則會擷取最新的版本。 預設值:5
Returns:
承諾,其解析為代表可用版本的 對象數位(排序為最舊版本)。 物件具有下列屬性:
id
:版本識別碼。- 注意:這與容器標識碼不同,並特別參考快照集版本,而不是容器。
date
:產生版本時的時間戳。
檢視容器版本
viewContainerVersion(id, containerSchema, version, compatibilityMode)
載入特定版本的容器,以便只檢視。 任何從 getContainerVersions
擷取的版本都可以使用,但為了復原損毀的數據,建議您從最新版本開始,並回溯尋找最新的未更正版本。
容器會以暫停狀態載入,這表示不會將後續變更套用至產生該快照集之後所發生的數據。 當載入此狀態時,可能會讀取容器數據,但無法編輯。
Parameters:
id
:容器標識碼。 這是呼叫getContainer
時所使用的相同標識碼。containerSchema
:容器架構。 這是呼叫getContainer
時所使用的相同架構。version
:參考要載入之版本的版本物件。 版本物件可以透過getContainerVersions
擷取。compatibilityMode
:相容性模式。 這是呼叫getContainer
時所使用的相同相容性模式。
Returns:
表示具有單一屬性之已載入容器之對象的承諾:
container
:容器物件。 這與 所getContainer
傳回的容器物件類型相同,但已從選取的版本暫停其先前狀態。
範例
const azureClient = new AzureClient(/* ... */);
const versions = await azureClient.getContainerVersions(id);
// Since the versions are sorted in order from newest to oldest, versions[0] will attempt to load the most recent version.
// If the most recent version is corrupted, we could try again with versions[1] and so on to find the most-recent uncorrupted version.
const { container } = await azureClient.viewContainerVersion(id, containerSchema, versions[0], "2");
// We can now start reading the data from the container.
const someData = container.initialObjects.someSharedMap.get("hello");
// With the data extracted, we can inject it into a new uncorrupted container and attach it to start collaborating again.
const { container: newContainer } = await azureClient.createContainer(containerSchema, "2");
newContainer.initialObjects.someSharedMap.set("hello", someData);
const newId = await newContainer.attach();
重要觀察
我們正在建立新的容器
我們不會復原 (回復) 現有的容器。 copyContainer
會提供新的實例,並將數據從原始容器複製。 在此程式中,不會刪除舊的容器。
已卸離新的容器
新的容器一開始處於 detached
狀態。 我們可以繼續使用中斷連結的容器,或立即附加。 呼叫 attach
之後,我們將取得唯一的容器標識符,代表新建立的實例。
復原後考慮
在建置復原後案例周圍的使用案例時,以下是幾個應用程式可能想要讓遠端共同作業者再次處理相同容器的考慮。
如果您要只使用流暢容器來建立應用程式數據的模型,當容器損毀時,通訊「連結」會有效中斷。 類似的真實世界範例可能是影片通話,原始作者與參與者共用連結,且該連結不再運作。 考慮到這個觀點,其中一個選項是限制原始作者的復原許可權,並讓他們以與共用原始連結相同的方式共用新的容器連結,在復原原始容器的復本之後。
或者,如果您只針對暫時性數據使用流暢的架構,您一律可以使用自己的真實來源數據和支援服務來管理更自主的復原工作流程。 例如,多個用戶端可能會開始復原程式,直到您的應用程式有第一個復原的複本為止。 然後,您的應用程式可以通知所有參與的用戶端,以轉換到新的容器。 這很實用,因為任何目前作用中的用戶端都可以解除封鎖參與群組以繼續進行共同作業。 此處的一個考慮是產生備援的成本。