Orleans:构建高性能分布式Actor服务
上QQ阅读APP看书,第一时间看更新

2.3 Grain的标识方法

Orleans应用程序中的Grain实例对象与面向对象程序(OOP)中的类实例对象有着许多相似之处,例如,它们实际都存在于应用服务器内存区块中,外部服务都需要通过对象的“引用”访问其内部数据及方法。

在.NET、Java等OOP语言中,当开发人员使用new关键字创建一个对象实例时,运行时所返回的引用对象值即指向内存区块中的对象实例,外部服务可使用该地址访问对象实例。相比而言,在Orleans运行时内,由于每一个Grain实例都虚拟存在于Orleans运行时内,外部服务在对任意Grain实例进行访问时并不需要显式地创建模板Grain实例,而仅需通向Orleans运行时传递该Grain实例的逻辑标识,在Orleans运行时内部对该标识进行解析并完成Grain实例的寻址过程,并在服务集群中确定该Grain实例的实际位置(服务节点位置)即可。在Orleans中该逻辑标识被称为Grain ID,开发人员可以使用一个全局唯一标识符(GUID)、长整数或字符串作为Grain实例的逻辑标识。

Orleans运行时采用了一个名为UniqueKey的内部类作为每个Grain实例的逻辑标识键:

当程序使用GUID进行Grain寻址时,N0及N1分别由GUID字节数组的0~7及8~15位生成;采用长整数寻址时,N1即为地址值,同时N0恒为0。而TypeCodeData的最低4字节标识了其所标识的对象类别,UniqueKey类型编码的定义见表2-1。

表2-1 UniqueKey类型编码定义

UniqueKey中的KeyExt字段存储了用户为Grain实例指定的扩展字符串,该字段将与N0、N1及TypeCodeData字段一起作为Grain实例的逻辑标识,而当用户仅使用自定义字符串进行寻址时,UniqueKey中的N0及N1字段将被自动置为0。

开发人员可以通过指定Grain服务接口类型的基类接口来定义Grain服务类型的标识方式。

在以上示例中,Worker接口展示了5种采用不同标识方式的Grain类型定义,在对Worker Grain发起服务请求时,调用方需要向Orleans运行时传递相应格式的Grain ID对Grain实例进行寻址,如: