经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.NET分布式Orleans - 5 - 持久化
来源:cnblogs  作者:chester·chen  时间:2024/3/29 8:50:32  对本文有异议

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

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<TState> 的实例作为构造函数参数注入到 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<TState> 为 grain 添加存储

  1. [StorageProvider(ProviderName="store1")]
  2. public class MyGrain : Grain<MyGrainState>, /*...*/
  3. {
  4. /*...*/
  5. }

 

原文链接:https://www.cnblogs.com/chenyishi/p/18097148

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号