![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=1739224963-SgRRK4mHsrEbWTgUSUDsMkOASWDcKhZE-0-1dec400971d9123f509e8e2123eab80b)
当程序使用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=1739224963-nWeTARRHaAkULE5L0mDyE7yxQQvojGYp-0-7b70b129a2e22588d08aa0ad144a6fde)
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=1739224963-WHddZdpSdaUjdrR0hZfuh94IU4q2Mdf6-0-ce08c33e41edde65808702730a4ba08d)
在以上示例中,Worker接口展示了5种采用不同标识方式的Grain类型定义,在对Worker Grain发起服务请求时,调用方需要向Orleans运行时传递相应格式的Grain ID对Grain实例进行寻址,如:
![](https://epubservercos.yuewen.com/5DD5C6/23446275701391606/epubprivate/OEBPS/Images/21_02.jpg?sign=1739224963-BwcXGllZfo6ojO9qb46XLRyIJ2iG3Nk8-0-561a04f9f400f47ebd438a7359027413)
![](https://epubservercos.yuewen.com/5DD5C6/23446275701391606/epubprivate/OEBPS/Images/22_01.jpg?sign=1739224963-xcvYzcsPQ8tSRbd7sO5eF5PTef1QreUZ-0-bef463781e4335a4a524530ee947c2c0)