Learn Orleans 04 - Persistent

只谈情不闲聊 提交于 2020-03-30 01:50:56

上一讲,我们能够通过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包,并初始化数据库

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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!