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

嚴華  金牌会员 | 2024-5-15 13:03:14 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 913|帖子 913|积分 2739

在分布式体系中,数据的持久化是至关重要的一环。
Orleans 7 引入了强大的持久化功能,使得在分布式环境下管理数据变得更加轻松和可靠。
本文将先容什么是 Orleans 7 的持久化,如何设置它以及相应的代码示例。
什么是 Orleans 7 的持久化?

Orleans 7 的持久化是指将 Orleans 中的状态数据持久化到外部存储介质,以便在应用步伐重新启动或节点故障时能够恢复数据。
这对于构建可靠的分布式体系至关重要,由于它确保了数据的持久性和同等性。
持久化使得 Orleans 可以在不丢失数据的情况下处理节点故障或应用步伐的重新启动。
它还可以用于支持扩展性和负载均衡,由于数据可以在集群中的差别节点上进行分布式存储。
Orleans 7 的持久化怎么设置?

持久化目前支持以下数据库:

  • SQL Server
  • MySQL/MariaDB
  • PostgreSQL
  • Oracle
我们拿SQL Server举例,首先必要安装基础包
  1. Install-Package Microsoft.Orleans.Persistence.AdoNet
复制代码
按照以下链接,创建对应的数据库表
https://learn.microsoft.com/zh-cn/dotnet/orleans/host/configuration-guide/adonet-configuration
并进行ADO.NET配置
  1. var invariant = "System.Data.SqlClient";
  2. var connectionString = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=orleanstest;User Id=sa;Password=1234;";
  3. // Use ADO.NET for clustering
  4. siloHostBuilder.UseAdoNetClustering(options =>
  5. {
  6.     options.Invariant = invariant;
  7.     options.ConnectionString = connectionString;
  8. }).ConfigureLogging(logging => logging.AddConsole()); ;
  9. siloHostBuilder.Configure<ClusterOptions>(options =>
  10. {
  11.     options.ClusterId = "my-first-cluster";
  12.     options.ServiceId = "SampleApp";
  13. });
  14. // Use ADO.NET for persistence
  15. siloHostBuilder.AddAdoNetGrainStorage("GrainStorageForTest", options =>
  16. {
  17.     options.Invariant = invariant;
  18.     options.ConnectionString = connectionString;
  19. });
复制代码
如何利用

可利用IPersistentState 的实例作为构造函数参数注入到 grain 中。
并可以利用 PersistentStateAttribute 属性批注这些参数,以标识要注入的状态的名称,以及提供该状态的存储提供步伐的名称。
  1. public class ProfileState
  2. {
  3.     public string Name { get; set; }
  4.     public Date DateOfBirth { get; set; }
  5. }
  6. public interface IUserGrain : IGrainWithStringKey
  7. {
  8.     Task<string> GetNameAsync();
  9.     Task SetNameAsync(string name);
  10. }
  11. public class UserGrain : Grain, IUserGrain
  12. {
  13.     private readonly IPersistentState<ProfileState> _profile;
  14.     public UserGrain([PersistentState("profile", "GrainStorageForTest")] IPersistentState<ProfileState> profile)
  15.     {
  16.         _profile = profile;
  17.     }
  18.     public async Task<string> GetNameAsync()
  19.     {
  20.         await _profile.ReadStateAsync();
  21.         return await Task.FromResult(_profile.State.Name);
  22.     }
  23.     public async Task SetNameAsync(string name)
  24.     {
  25.         _profile.State.Name = name;
  26.         await _profile.WriteStateAsync();
  27.     }
  28. }
复制代码
也可以利用Grain 为 grain 添加存储
  1. [StorageProvider(ProviderName="store1")]
  2. public class MyGrain : Grain<MyGrainState>, /*...*/
  3. {
  4.   /*...*/
  5. }
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表