在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
在分散式系統中,數據的持久化是至關重要的一環。
Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。
本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。
什麼是 Orleans 7 的持久化?
Orleans 7 的持久化是指將 Orleans 中的狀態數據持久化到外部存儲介質,以便在應用程式重新啟動或節點故障時能夠恢複數據。
這對於構建可靠的分散式系統至關重要,因為它確保了數據的持久性和一致性。
持久化使得 Orleans 可以在不丟失數據的情況下處理節點故障或應用程式的重新啟動。
它還可以用於支持擴展性和負載平衡,因為數據可以在集群中的不同節點上進行分散式存儲。
Orleans 7 的持久化怎麼設置?
持久化目前支持以下資料庫:
- SQL Server
- MySQL/MariaDB
- PostgreSQL
- Oracle
我們拿SQL Server舉例,首先需要安裝基礎包
Install-Package Microsoft.Orleans.Persistence.AdoNet
按照以下鏈接,創建對應的資料庫表
https://learn.microsoft.com/zh-cn/dotnet/orleans/host/configuration-guide/adonet-configuration
併進行ADO.NET配置
var invariant = "System.Data.SqlClient"; var connectionString = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=orleanstest;User Id=sa;Password=1234;"; // Use ADO.NET for clustering siloHostBuilder.UseAdoNetClustering(options => { options.Invariant = invariant; options.ConnectionString = connectionString; }).ConfigureLogging(logging => logging.AddConsole()); ; siloHostBuilder.Configure<ClusterOptions>(options => { options.ClusterId = "my-first-cluster"; options.ServiceId = "SampleApp"; }); // Use ADO.NET for persistence siloHostBuilder.AddAdoNetGrainStorage("GrainStorageForTest", options => { options.Invariant = invariant; options.ConnectionString = connectionString; });
如何使用
可使用IPersistentState<TState> 的實例作為構造函數參數註入到 grain 中。
並可以使用 PersistentStateAttribute 屬性批註這些參數,以標識要註入的狀態的名稱,以及提供該狀態的存儲提供程式的名稱。
public class ProfileState { public string Name { get; set; } public Date DateOfBirth { get; set; } } public interface IUserGrain : IGrainWithStringKey { Task<string> GetNameAsync(); Task SetNameAsync(string name); } public class UserGrain : Grain, IUserGrain { private readonly IPersistentState<ProfileState> _profile; public UserGrain([PersistentState("profile", "GrainStorageForTest")] IPersistentState<ProfileState> profile) { _profile = profile; } public async Task<string> GetNameAsync() { await _profile.ReadStateAsync(); return await Task.FromResult(_profile.State.Name); } public async Task SetNameAsync(string name) { _profile.State.Name = name; await _profile.WriteStateAsync(); } }
也可以使用Grain<TState> 為 grain 添加存儲
[StorageProvider(ProviderName="store1")] public class MyGrain : Grain<MyGrainState>, /*...*/ { /*...*/ }