zoukankan      html  css  js  c++  java
  • Learn Orleans 04

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

    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中

    参考:
    https://www.cnblogs.com/gaopang/p/7409778.html
    https://www.cnblogs.com/sheng-jie/p/orlans-state-grain.html

  • 相关阅读:
    ACM HDU 1176 免费馅饼(DP)
    PHP下载时中文文件名乱码的问题
    NYOJ 27
    NYOJ 148
    NYOJ 8
    NYOJ 138
    NYOJ 461
    POJ 1200
    STL排序算法
    NYOJ 523
  • 原文地址:https://www.cnblogs.com/wswind/p/12596240.html
Copyright © 2011-2022 走看看