日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Actor-ES框架:Ray-Handler之CoreHandler编写

發布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Actor-ES框架:Ray-Handler之CoreHandler编写 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如圖右上角所示,Ray中有兩類Handler(SubHandler和PartSubHandler),在使用中,SubHandler派生Actor的CoreHandler,PartSubHandler派生SQLToReadHandler,SQLToReadHandler派生Actor的ToReadHandler,使用Ray主要寫Actor的CoreHandler和ToReadHandler。

CoreHandler是復合消息路由器,包含的功能有:消息路由器、消息處理器、消息分離器、消息聚合器、消息過濾器、消息豐富器、副本同步協調器。

消息路由器:

Tell方法中的Switch塊,針對不同的Event類型,將Event事件中的數據分發給不同的事件處理方法CoreHandler承擔的是消息路由器的作用。如下代碼:

public override Task Tell(byte[] bytes, IActorOwnMessage<string> data, MessageInfo msg) {switch (data){case CoinAddressGeneratingResponse value: return AcceptCoinAddressAsync(value);case CoinWithdrawWithholdingFailedMsg value: return RollbackWithholdingAsync(value);case CoinWithdrawWithheldEvent value: return CreateWithdrawAsync(value);case CoinOrderCreatedEvent value: return CreateOrderAsync(value);case CoinOrderCreatedEventV1 value: return CreateOrderAsyncV1(value);case CoinPlanOrderCreatedEvent value: return CreatePlanOrderAsync(value);case CoinDepositIncreasedEvent value: return CoinDepositIncreased(value);case CoinIcoEvent value: return CoinIcoEventHandle(value);default: return Task.CompletedTask;} }
消息處理器:

針對不同的Event類型,在該Actor的CoreHandler里處理該事件,CoreHandler承擔的是消息處理器的作用。如下代碼中,AmountAddEventHandler方法處理AmountTransferEvent事件。

在事件處理代碼中,可編寫的代碼如下:

  • 可以只針對當前事件處理。

  • 可以獲得其他actor引用,調用其他actor的方法(包括actor的只讀方法和寫操作方法)。

  • 可以調用數據訪問層進行數據庫讀寫。(寫方法建議在ToReadHandler中進行)。

public override Task Tell(byte[] bytes, IActorOwnMessage<string> data, MessageInfo msg) {switch (data){case AmountTransferEvent value: return AmountAddEventHandler(value);default: return Task.CompletedTask;} }public Task AmountAddEventHandler(AmountTransferEvent value) {var toActor = HandlerStart.Client.GetGrain<IAccount>(value.ToAccountId);return toActor.AddAmount(value.Amount, value.Id); }
消息分離器:

當需要將較大的消息分割成多個獨立的部分,并將這些獨立的部分作為其他actor處理的參數時,CoreHandler承擔的是分離器的作用。

消息聚合器:

當需要對不同類型消息中的數據進行聚合統計時,CoreHandler承擔的是消息聚合器的作用。
例如:在加密貨幣交易的場景中,有ETH、BTC、USDT不同的市場,EOS在三個市場中都有交易,現在要統計本周內每個用戶EOS的交易量,可以如下操作:

public override Task Tell(byte[] bytes, IActorOwnMessage<string> data, MessageInfo msg) {switch (data){case CoinTradeSoldEvent value: return ActivitySellStatistic(value);case CoinTradeBoughtEvent value: return ActivityBuyStatistic(value);default: return Task.CompletedTask;} }
消息過濾器:

CoreHandler有可能收到它不感興趣額的消息,并且需要丟棄這些無用消息時,CoreHandler可以承擔消息過濾器的作用。

public override Task Tell(byte[] bytes, IActorOwnMessage<string> data, MessageInfo msg) {switch (data){case AmountTransferEvent value: return AmountAddEventHandler(value);default: return Task.CompletedTask;//消息過濾} }
消息豐富器:

當需要將收到的消息分進一步豐富,并將豐富后的消息作為其他actor處理的參數時,CoreHandler承擔的是消息豐富器的作用。

副本同步協調器:

Ray中有主actor和副本actor兩類actor,副本actor用于分擔主actor的壓力,執行一些異步操作。當使用副本actor,需要主actor與副本actor保持同步時,需要CoreHandler將關注的事件交給副本actor,此時CoreHandler承擔的是副本同步協調器的作用。

public override Task Tell(byte[] bytes, IActorOwnMessage<string> data, MessageInfo msg){var replicatedRef = HandlerStart.Client.GetGrain<IAccountRep>(data.StateId);//獲得副本actorvar task = replicatedRef.Tell(bytes);//通知副本同步switch (data){case AmountTransferEvent value: return Task.WhenAll(task, AmountAddEventHandler(value));default: return task;}}
示例

參考Example中,Ray.Handler項目內的AccountCoreHandler。

總結

CoreHandler實際編寫中很簡單,主要承擔消息路由和消息處理器的作用,其他功能為特殊場景提供了切入點。

相關文章:

  • Actor-ES框架:Ray

  • Actor-ES框架:Ray--事件(Event)編寫說明

  • Ray框架Q&A


原文地址:http://www.cnblogs.com/CharlesZHENG/p/8413193.html


.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

總結

以上是生活随笔為你收集整理的Actor-ES框架:Ray-Handler之CoreHandler编写的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。