Orleans核心功能
2017-12-24

一、Grain持久化

1,Grain持久化目标 

①允许不同类型的存储提供者使用不同类型的存储提供者(例如,一个使用Azure表,一个使用ADO.NET表),或者使用不同类型的存储提供者,但具有不同的配置(例如,两者都使用Azure表, 存储帐户#1和一个使用存储帐户#2)

②允许配置存储提供程序实例(例如Dev-Test-Prod),只更改配置文件,不需要更改代码。

③提供一个框架,以便稍后由Orleans团队或其他人编写其他存储提供程序。

④提供最少量的生产级存储提供商

⑤存储提供者可以完全控制他们如何在持久性后台存储中存储Grain状态数据。 推论:Orleans没有提供全面的ORM存储解决方案,但允许定制存储提供商在需要时支持特定的ORM要求。

2,Grain持久化Api

Grain类型可以通过以下两种方式之一进行声明:

  • 如果它们没有任何持久状态,或者它们将自己处理所有的持续状态,则扩展Grain
  • 如果他们有一些他们想要Orleans运行时处理的持续状态,请扩展Grain <T>。 换句话说,通过扩展Grain <T>,grain类型自动加入到Orleans系统管理的持久化框架中。

对于本节的其余部分,我们将只考虑选项#2 / Grain <T>,因为选项1的Grain将继续像现在一样运行而不会有任何行为改变。

3,Grain状态存储

从Grain <T>继承的Grain类(其中T是需要持久化的特定于应用程序的状态数据类型)将从指定的存储区自动加载它们的状态。

Grain将被标记为[StorageProvider]属性,该属性指定用于读取/写入谷物的状态数据的存储提供者的命名实例。

[StorageProvider(ProviderName="store1")]public class MyGrain<MyGrainState> ...
{
  ...
}

Orleans提供者管理框架提供了一种机制,指定和注册仓储配置文件不同的存储供应商和存储选项。

<OrleansConfiguration xmlns="urn:orleans">

    <Globals>

    <StorageProviders>

        <Provider Type="Orleans.Storage.MemoryStorage" Name="DevStore" />

        <Provider Type="Orleans.Storage.AzureTableStorage" Name="store1"

            DataConnectionString="DefaultEndpointsProtocol=https;AccountName=data1;AccountKey=SOMETHING1" />

        <Provider Type="Orleans.Storage.AzureBlobStorage" Name="store2"

            DataConnectionString="DefaultEndpointsProtocol=https;AccountName=data2;AccountKey=SOMETHING2"  />

    </StorageProviders>


4,配置存储提供程序

①AzureTableStorage

<Provider Type="Orleans.Storage.AzureTableStorage" Name="TableStore"
    DataConnectionString="UseDevelopmentStorage=true" />

以下属性可以添加到<Provider />元素来配置提供程序:

  • DataConnectionString="..."(必需) - 要使用的Azure存储连接字符串
  • TableName="OrleansGrainState" (可选) - 表格存储中使用的表格名称,默认为OrleansGrainState
  • DeleteStateOnClear="false" (可选) - 如果为true,则在grain状态被清除时记录将被删除,否则将写入空记录,默认为false
  • UseJsonFormat="false" (可选) - 如果为true,则使用json序列化程序,否则将使用Orleans二进制序列化程序,默认为false
  • UseFullAssemblyNames="false"(可选) - (如果UseJsonFormat =“true”)序列化具有完整程序集名称(true)或简单(false)的类型,默认为false
  • IndentJSON="false"(可选) - (如果UseJsonFormat =“true”)缩进序列化的json,默认为false

注意:状态不应超过64KB,由表存储限制。

②AzureBlobStorage

<Provider Type="Orleans.Storage.AzureTableStorage" Name="BlobStore"
    DataConnectionString="UseDevelopmentStorage=true" />

以下属性可以添加到<Provider />元素来配置提供程序:

  • DataConnectionString="..." (必需) - 要使用的Azure存储连接字符串
  • ContainerName="grainstate" (可选) - 要使用的Blob存储容器,默认为grainstate
  • UseFullAssemblyNames="false" (可选) - 使用完整程序集名称(true)或简单(false)序列化类型,默认为false
  • IndentJSON="false" (可选) - 缩进序列化的json,默认为false

③DynamoDBStorageProvider

<Provider Type="Orleans.Storage.DynamoDBStorageProvider" Name="DDBStore"
    DataConnectionString="Service=us-wes-1;AccessKey=MY_ACCESS_KEY;SecretKey=MY_SECRET_KEY;" />
  • DataConnectionString="..."(必需) - 要使用的DynamoDB存储连接字符串。 您可以在其中设置Service,AccessKey,SecretKey,ReadCapacityUnits和WriteCapacityUnits。
  • TableName="OrleansGrainState" (可选) - 表格存储中使用的表格名称,默认为OrleansGrainState
  • DeleteStateOnClear="false" (可选) - 如果为true,则在grain状态被清除时记录将被删除,否则将写入空记录,默认为false
  • UseJsonFormat="false" (可选) - 如果为true,则使用json序列化程序,否则将使用Orleans二进制序列化程序,默认为false
  • UseFullAssemblyNames="false" (可选) - (如果UseJsonFormat =“true”)序列化具有完整程序集名称(true)或简单(false)的类型,默认为false
  • IndentJSON="false" (可选) - (如果UseJsonFormat =“true”)缩进序列化的json,默认为false

④ADO.NET Storage Provider (SQL Storage Provider)

ADO .NET存储提供程序允许您在关系数据库中存储grain状态。 目前支持以下数据库:

  • SQL Server
  • MySQL/MariaDB
  • PostgreSQL
  • Oracle

首先,安装基础包: Install-Package Microsoft.Orleans.OrleansSqlUtils 

在与您的项目一起安装软件包的文件夹下,可以找到支持数据库供应商的不同SQL脚本。 你也可以从OrleansSQLUtils仓库获取它们。 创建一个数据库,然后运行适当的脚本来创建表。

接下来的步骤是安装第二个NuGet软件包(请参阅下表),并根据需要安装数据库供应商,并以编程方式或通过XML配置来配置存储提供程序。

Database Script NuGet Package AdoInvariant Remarks
SQL Server CreateOrleansTables_SQLServer.sql System.Data.SqlClient System.Data.SqlClient
MySQL / MariaDB CreateOrleansTables_MySQL.sql MySql.Data MySql.Data.MySqlClient
PostgreSQL CreateOrleansTables_PostgreSQL.sql Npgsql Npgsql
Oracle CreateOrleansTables_Oracle.sql ODP.net Oracle.DataAccess.Client No .net Core support

 以下是如何使用XML配置来配置ADO .NET存储提供程序的示例:

<OrleansConfiguration xmlns="urn:orleans">

  <Globals>

    <StorageProviders>

      <Provider Type="Orleans.Storage.AdoNetStorageProvider"

                Name="OrleansStorage"

                AdoInvariant="<AdoInvariant>"

                DataConnectionString="<ConnectionString>"

                UseJsonFormat="true" />

    </StorageProviders>

  </Globals>

</OrleansConfiguration>

在代码中,你需要像下面这样的东西:

var properties = new Dictionary<string, string>()

{

    ["AdoInvariant"] = "<AdoInvariant>",

    ["DataConnectionString"] = "<ConnectionString>",

    ["UseJsonFormat"] = "true"

};


config.Globals.RegisterStorageProvider<AdoNetStorageProvider>("OrleansStorage", properties);


本质上,您只需要设置数据库供应商特定的连接字符串和标识供应商的AdoInvariant(参见上表)。 您也可以选择保存数据的格式,可以是二进制(默认),JSON或XML。 虽然二进制是最紧凑的选项,但它是不透明的,你将无法读取或处理数据。 JSON是推荐的选项。

您可以设置以下属性:

Name Type Description
Name String 持久性Grain将用于引用这个存储提供程序的任意名称
Type String 设置为 Orleans.Storage.AdoNetStorageProvider
AdoInvariant String 标识数据库供应商(请参阅上表中的值;默认是System.Data.SqlClient)
DataConnectionString String 供应商特定的数据库连接字符串(必需)
UseJsonFormat Boolean 使用JSON格式(推荐)
UseXmlFormat Boolean 使用XML格式
UseBinaryFormat Boolean 使用紧凑的二进制格式(默认)

StorageProviders示例提供了一些代码,您可以使用它们来快速测试以上内容,并展示一些自定义存储提供程序。 在软件包管理器控制台中使用以下命令将所有的Orleans软件包更新到最新版本:

Get-Package | where Id -like 'Microsoft.Orleans.*' | foreach { update-package $_.Id }

ADO.NET持久性具有对数据进行版本化的功能,并可以使用任意应用程序规则和流来定义任意(de)序列化程序,但目前没有办法将它们公开给应用程序代码。

⑤MemoryStorage

MemoryStorage是一个简单的存储提供者,它并不真正使用下面的持久数据存储。 了解如何快速与存储提供商合作很方便,但不打算在实际情况下使用。

注意:这个提供者将状态持久化到不稳定的内存中,该内存在仓储关闭时被删除。只使用进行测试。

使用XML配置设置内存存储提供程序:

<?xml version="1.0" encoding="utf-8"?>

<OrleansConfiguration xmlns="urn:orleans">

  <Globals>

    <StorageProviders>

      <Provider Type="Orleans.Storage.MemoryStorage"

                Name="OrleansStorage"

                NumStorageGrains="10" />

    </StorageProviders>

  </Globals>

</OrleansConfiguration>

要在代码中设置它:

siloHost.Config.Globals.RegisterStorageProvider<MemoryStorage>("OrleansStorage");

您可以设置以下属性:

Name Type Description
Name String 持久性Grain将用于引用这个存储提供程序的任意名称
Type String 设置为 Orleans.Storage.MemoryStorage
NumStorageGrains Integer 用来存储状态的Grain数量,默认为10

⑥ShardedStorageProvider

<Provider Type="Orleans.Storage.ShardedStorageProvider" Name="ShardedStorage">
    <Provider />
    <Provider />
    <Provider />
</Provider>

简单的存储提供程序,用于编写多个其他存储提供程序共享的Grain状态数据。

一致的散列函数(默认是Jenkins Hash)用于决定哪个碎片(按照它们在配置文件中定义的顺序)负责存储指定Grain的状态数据,然后将读/写/清除请求桥接 到合适的底层提供者执行。

⑦存储提供者的注意事项

如果没有为Grain <T> grain类指定[StorageProvider]属性,则会搜索名为Default的提供程序。 如果没有找到,则将其视为缺少的存储提供者。

如果在仓储配置文件中只有一个提供者,它将被视为这个仓储的默认提供者。

使用存储提供程序的Grain(Grain装载时不存在并定义在Grain配置中)将无法加载,但是仓储里的其他Grain仍然可以装载和运行。Orleans之后的任何一种Grain类型的调用都将失败。指定未加载Grain类型的Storage.BadProviderConfigException错误。

用于给定Grain类型的存储提供程序实例由该Grain类型的[StorageProvider]属性中定义的存储提供程序名称,加上仓储配置中定义的提供者的提供者类型和配置选项。

不同的Grain类型可以使用不同的配置存储提供程序,即使它们是相同的类型:例如,两个不同的Azure表存储提供程序实例连接到不同的Azure存储帐户(请参阅上面的配置文件示例)。

存储提供程序的所有配置详细信息是在仓储启动时读取的仓储配置中静态定义的。 目前没有提供机制来动态更新或更改仓储所使用的存储提供商列表。 但是,这是一个优先/工作量约束,而不是一个基本的设计约束。

 

5,状态存储API

对于Grain 状态/持久性api有两个主要部分:grainto - runtime和runtimeto - storage - provider。

 

6,Grain状态存储API

Orleans Runtime中的Grain状态存储功能将提供读写操作,以自动填充/保存该Grain的GrainState数据对象。 在内部,这些功能将被连接到通过配置为该Grain适当持久性提供(由Orleans 客户端根工具生成的代码中)。 

 

7,Grain状态读/写功能

当Grain被激活时,Grain状态将自动被读取,但是Grain负责明确地触发任何改变的Grain状态的写入。 有关错误处理机制的详细信息,请参见下面的失败模式部分。

在为该激活调用OnActivateAsync()方法之前,将自动读取GrainState(使用base.ReadStateAsync()的等效项)。 在任何方法调用Grain之前,Grain状态不会被刷新,除非这个Grain被激活了。

在任何grain方法调用期间,grain可以请求Orleans运行时通过调用base.WriteStateAsync()将该激活的当前grain状态数据写入指定的存储提供者。 粮食是负责执行明确写操作时,他们做出显著更新他们的状态数据。 最常见的是,grain方法将返回base.WriteStateAsync()任务作为从grain方法返回的最终结果Task,但不要求遵循此模式。 在任何grain方法之后,运行时不会自动更新存储的粮食状态。

二、定时器和提醒

 

三、依赖注入

 

四、观察者

 

五、无状态工作者Grains

 

六、流



原文:http://www.cnblogs.com/zd1994/p/8094562.html 

下一条: