Share via


記錄一致性提供者

Microsoft.Orleans.EventSourcing 套件包含數個記錄一致性提供者,涵蓋適合開始使用的基本案例,並允許一些擴充性。

狀態儲存體

Orleans.EventSourcing.StateStorage.LogConsistencyProvider 會使用可獨立設定的標準儲存體提供者,來儲存精細度狀態快照集

儲存體中保留的資料是物件,其中包含精細度狀態 (JournaledGrain 的第一個型別參數所指定) 和一些中繼資料 (版本號碼,以及用來避免儲存體存取失敗時事件重複的特殊標記)。

由於每次存取儲存體時都會讀取/寫入整個精細度狀態,因此此提供者不適用於精細度狀態非常大的物件。

此提供者不支援 RetrieveConfirmedEvents,因為事件不會保存,所以無法從儲存體擷取事件。

記錄儲存體

Orleans.EventSourcing.LogStorage.LogConsistencyProvider 會使用可獨立設定的標準儲存體提供者,儲存完整的事件順序為單一物件

儲存體中保留的資料是物件,其中包含 List<EventType> object 和一些中繼資料 (用來避免在儲存體存取失敗時事件重複的特殊標記)。

此提供者支援 RetrieveConfirmedEvents。 所有事件一律可供使用,並保留在記憶體中。

由於每次存取儲存體時都會讀取/寫入整個事件序列,因此此提供者不適合用於生產環境,除非保證事件序列維持相當短。 此提供者的主要目的是說明事件來源的語意,以及範例/測試環境的語意。

自訂儲存體

這個 Orleans.EventSourcing.CustomStorage.LogConsistencyProvider 可讓開發人員插入其儲存體介面,然後在適當的時間由一致性通訊協定呼叫。 此提供者不會對儲存的項目是狀態快照集或事件做出特定假設 - 程式設計人員會假設控制該選擇 (而且可以儲存其中一項或同時儲存)。

若要使用此提供者,精細度必須像之前一樣衍生自 JournaledGrain<TGrainState,TEventBase>,但另外也必須實作下列介面:

public interface ICustomStorageInterface<StateType, EventType>
{
    Task<KeyValuePair<int, StateType>> ReadStateFromStorage();

    Task<bool> ApplyUpdatesToStorage(
        IReadOnlyList<EventType> updates,
        int expectedVersion);
}

一致性提供者預期這些提供者會以某種方式運作。 程式設計人員應該注意:

  • 第一個方法 ReadStateFromStorage 預期會同時傳回版本和狀態讀取。 如果尚未儲存任何項目,應該會針對版本傳回零,且符合的狀態會對應至 StateType 的預設建構函式。

  • 如果預期版本與實際版本不相符,ApplyUpdatesToStorage 必須傳回 False (這類似於 e-tag 檢查)。

  • 如果 ApplyUpdatesToStorage 失敗並出現例外狀況,則一致性提供者會重試。 這表示如果擲回這類例外狀況,但事件已保存,可能會重複某些事件。 開發人員必須負責確定這是安全的:例如,藉由不擲回例外狀況來避免這種情況,或確保重複的事件對應用程式邏輯無損害,或新增一些額外的機制來篩選重複項目。

此提供者不支援 RetrieveConfirmedEvents。 當然,由於開發人員仍然控制儲存體介面,因此原本就不需要呼叫此項目,但可以實作其事件擷取。