|
在分布式系统中,数据的持久化是至关重要的一环。
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 的实例作为构造函数参数注入到 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 为 grain 添加存储- [StorageProvider(ProviderName="store1")]
- public class MyGrain : Grain<MyGrainState>, /*...*/
- {
- /*...*/
- }
复制代码
来源:https://www.cnblogs.com/chenyishi/p/18097148
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|