.NET分布式Orleans – 5 – 持久化

  • .NET分布式Orleans – 5 – 持久化已关闭评论
  • 33 次浏览
  • A+
所属分类:.NET技术
摘要

在分布式系统中,数据的持久化是至关重要的一环。Orleans 7 引入了强大的持久化功能,使得在分布式环境下管理数据变得更加轻松和可靠。

在分布式系统中,数据的持久化是至关重要的一环。

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