.NET分佈式Orleans - 5 - 持久化

在分佈式系統中,數據的持久化是至關重要的一環。

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>, /*...*/
{
  /*...*/
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章