上一讲,我们能够通过HelloWorld多线程来实现无锁的请求响应。
这一讲,我们来讲解如何保存Actor的状态。
Actor的状态是通过消息来访问来改变的,对应到上一讲的计数例子,Actor的状态其实是记录于内存中,通过成员遍历_count来保存。
这一讲通过改造上一讲的例子,来讲述Orleans的State状态保存机制。
上一讲中我们的Grain定义为:
public class HelloGrain : Orleans.Grain, IHello
Grain还有另外一种泛型定义,以State类型作为模板参数使用,对Grain的修改如下:
[StorageProvider(ProviderName="DevStore")] public class HelloGrain : Orleans.Grain<PersistentData>, IHello { …… public async Task AddCount() { this.State.Count ++; await this.WriteStateAsync(); } …… public override Task OnActivateAsync() { this.ReadStateAsync(); return base.OnActivateAsync(); } public override Task OnDeactivateAsync() { this.WriteStateAsync(); return base.OnDeactivateAsync(); } } public class PersistentData { public int Count { get; set; } }
PersistentData为HelloGrain绑定的状态类。在使用中,可以通过WriteState或者ReadState来载入或写入状态,通过this.State来操作状态。OnActivateAsync与OnDeactivateAsync 分别是Grain激活与取消激活的事件响应函数,可在此处处理状态读取与写入的逻辑。
StorageProvider标签可以指定Grain存储时所想要使用的存储提供者。
StorageProvider的设定,是在Silo中完成的。
首先需要安装nuget包
Install-Package Microsoft.Orleans.Persistence.AdoNet
然后通过AddAdoNetGrainStorage连接数据库。
private static async Task<ISiloHost> StartSilo() { // define the cluster configuration var builder = new SiloHostBuilder() .UseLocalhostClustering() .AddMemoryGrainStorage("DevStore") .AddAdoNetGrainStorage("OrleansStorage", options => { options.Invariant = "<Invariant>"; options.ConnectionString = "<ConnectionString>"; options.UseJsonFormat = true; }); …… }
需要按照所使用的数据库不同按照相应的ado.net包,并初始化数据库
Database | Script | NuGet Package | ADO.NET Invariant |
---|---|---|---|
SQL Server | SQLServer-Main.sql | System.Data.SqlClient | System.Data.SqlClient |
MySQL / MariaDB | MySQL-Main.sql | MySql.Data | MySql.Data.MySqlClient |
PostgreSQL | PostgreSQL-Main.sql | Npgsql | Npgsql |
Oracle | Oracle-Main.sql | ODP.net | Oracle.DataAccess.Client |
来源:https://www.cnblogs.com/wswind/p/12596240.html