iT邦幫忙

2022 iThome 鐵人賽

DAY 26
1

Orleans的GrainService是不同於Actor model運算模式的特殊System daemon,它可以用來在每個Silo提供類似系統服務的常駐程式。

GrainService介紹

  • GrainService不需要定義Grain識別子(Identifier),因為它不是一般Grain的物件實例,所以其RPC介面宣告需繼承自 IGrainService 介面,而非原本Grain的那五種: IGrainWithIntegerKeyIGrainWithStringKeyIGrainWithGuidKey IGrainWithIntegerCompoundKeyIGrainWithGuidCompoundKey RPC介面的基礎介面型別。
  • GrainService的RPC實作不繼承自Grain,而是繼承自 GrainService
  • GrainService的生命週期由Orleans管理,不需要開發者自行管理。要使得GrainService能作用,得在Silo配置程式碼中使用:
    1. 將GrainService的類別使用DI依賴注入註冊為Singleton。
    2. 呼叫SiloBuilder的 AddGrainService() 擴充方法來註冊GrainService。
  • GrainService本身可使用DI依賴注入的方式取得 IGrainFactory 物件,以便取得其他Grain的RPC參考來呼叫其方法。
  • GrainService無法直接被其他一般Grain呼叫,但可以透過撰寫繼承於GrainServiceClient的子類別Proxy物件去呼叫GrainService;然後把此呼叫GrainService的Proxy物件,使用Grain的建構子DI依賴注入的方式,讓Grain呼叫Proxy物件開放出來的方法,來呼叫GrainService。
  • GrainService無法被Orleans Client端直接呼叫,如果需要的話,可藉由定義一中介Grain去呼叫上述步驟設計的DI依賴注入的GrainServiceClient物件的方式來呼叫:

官方對於GrainService的應用,就是拿來實現Grain Reminder的機制,IReminderService 介面就是繼承自 IGrainService 介面,而 LocalReminderService 就是繼承自 GrainService 類別:
https://github.com/dotnet/orleans/blob/main/src/Orleans.Reminders/ReminderService/LocalReminderService.cs

GrainService實作範例

可使用GrainService來記特定Grain RPC方法呼叫次數,步驟如下:


上一篇
[25]---Orleans 的GitHub原始碼建置方法與 POCO Grain 開發方法
下一篇
[27]---Orleans Grain的Call Filter介紹
系列文
Microsoft Orleans雲原生開發框架從小白到大神39
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言