Learn Orleans 04 - 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脚本初始化数据库

https://dotnet.github.io/orleans/Documentation/clusters_and_clients/configuration_guide/adonet_configuration.html

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中

猜你喜欢

转载自www.cnblogs.com/wswind/p/12596240.html