Learn Orleans 04 - Persistent
https://github.com/wswind/learn-orleans/tree/master/02.Persistent
上一讲,我们能够通过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包,并执行Main.Sql,Persistence.sql脚本初始化数据库
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 |
Database | Script | NuGet Package | ADO.NET Invariant |
---|---|---|---|
SQL Server | SQLServer-Persistence.sql | System.Data.SqlClient | System.Data.SqlClient |
MySQL / MariaDB | MySQL-Persistence.sql | MySql.Data | MySql.Data.MySqlClient |
PostgreSQL | PostgreSQL-Persistence.sql | Npgsql | Npgsql |
Oracle | Oracle-Persistence.sql | ODP.net | Oracle.DataAccess.Client |
我这里Main.Sql中的一句话会卡死,应该我自己的数据库问题,我将其略过未执行
ALTER DATABASE [o3] SET READ_COMMITTED_SNAPSHOT ON;
SQL脚本创建了两张表,用于存储State。
State对象会直接序列号为Json、Xml或二进制,存储于Storage中
参考:
https://www.cnblogs.com/gaopang/p/7409778.html
https://www.cnblogs.com/sheng-jie/p/orlans-state-grain.html
本文采用 知识共享署名 4.0 国际许可协议 进行许可