![Orleans:构建高性能分布式Actor服务](https://wfqqreader-1252317822.image.myqcloud.com/cover/223/44175223/b_44175223.jpg)
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实例的逻辑标识键:
![](https://epubservercos.yuewen.com/5DD5C6/23446275701391606/epubprivate/OEBPS/Images/20_01.jpg?sign=1739558739-cyN8qsSjN8UHFP8FLfMOwxCUqn8Urifv-0-e97ff1dc6facf1137dfc7993d05fbc72)
当程序使用GUID进行Grain寻址时,N0及N1分别由GUID字节数组的0~7及8~15位生成;采用长整数寻址时,N1即为地址值,同时N0恒为0。而TypeCodeData的最低4字节标识了其所标识的对象类别,UniqueKey类型编码的定义见表2-1。
表2-1 UniqueKey类型编码定义
![](https://epubservercos.yuewen.com/5DD5C6/23446275701391606/epubprivate/OEBPS/Images/20_02.jpg?sign=1739558739-bpJvD7roCXKBBUFYnHnGVdfQK90FtGMW-0-cd734c5644b0086d148c46955b955369)
UniqueKey中的KeyExt字段存储了用户为Grain实例指定的扩展字符串,该字段将与N0、N1及TypeCodeData字段一起作为Grain实例的逻辑标识,而当用户仅使用自定义字符串进行寻址时,UniqueKey中的N0及N1字段将被自动置为0。
开发人员可以通过指定Grain服务接口类型的基类接口来定义Grain服务类型的标识方式。
![](https://epubservercos.yuewen.com/5DD5C6/23446275701391606/epubprivate/OEBPS/Images/21_01.jpg?sign=1739558739-1bBSJPJUZpolsgrIpFbpjOESol6Ncuus-0-632847531f1743e248e57f9d7162ec26)
在以上示例中,Worker接口展示了5种采用不同标识方式的Grain类型定义,在对Worker Grain发起服务请求时,调用方需要向Orleans运行时传递相应格式的Grain ID对Grain实例进行寻址,如:
![](https://epubservercos.yuewen.com/5DD5C6/23446275701391606/epubprivate/OEBPS/Images/21_02.jpg?sign=1739558739-yXstRB1FkuDQsBDCbbC4OvE51NH4QESu-0-33c23153774a355c1c8cbaf8243c148a)
![](https://epubservercos.yuewen.com/5DD5C6/23446275701391606/epubprivate/OEBPS/Images/22_01.jpg?sign=1739558739-7OnR4wbx4nLDTBk4C7uEAeVpNI7CND0i-0-fc7a95d408d6570b82540efbd1de231e)