如图右上角所示,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编写相关推荐

  1. Actor-ES框架:Ray-Handler之ToReadHandler编写

    如图右上角所示,Ray中有两类Handler(SubHandler和PartSubHandler),在使用中,SubHandler派生Actor的CoreHandler,PartSubHandler派 ...

  2. python分布式框架_高性能分布式执行框架——Ray

    Ray是UC Berkeley RISELab新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室 ...

  3. python分布式多进程框架 Ray

    全栈工程师开发手册 (作者:栾鹏) python教程全解 并行和分布式计算是现代应用程序的主要内容.我们需要利用多个核心或多台机器来加速应用程序或大规模运行它们.网络爬虫和搜索所使用的基础设施并不是在 ...

  4. python高性能_Python高性能分布式执行框架-Ray

    Ray是UC Berkeley RISELab新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能.Ray是一个基于Pyth ...

  5. 分布式执行框架——Ray简单使用

    Ray是UC Berkeley RISELab新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室 ...

  6. 有望取代Spark,Michael Jordan和Ion Stoica提出下一代分布式实时机器学习框架Ray牛在哪?...

    从MR到Spark再到Ray Michael I. Jordan力荐的Ray 尽在"Ray Summit Pre-Con" 2020年9月21日 09:00-12:10 Ray项目 ...

  7. 下一代的 Actor 模型框架 Proto Actor

    ProtoAct 是下一代的 Actor 模型框架,提供了 .NET 和 Go 语言的实现,默认支持分布式,提供管理和监控功能.在过去几年,我们经常看到两种 Actor 模型方法相互竞争,首先是经典的 ...

  8. 图像迁移风格保存模型_图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用...

    原标题:图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用 选自Medium 作者:Philip Meier 机器之心编译 编辑:陈萍 易于使用的神经风格迁移框架 py ...

  9. ChatGPT背后的开源AI框架Ray论文解读

    人工智能发展如火如荼,近期的chatGPT,圈内圈外人玩得不亦乐乎,本人试了几次不能访问,没有亲自玩一下,有些遗憾.但chatGPT背后的开源框架Ray的原始论文可以试着解读一下,分享给大家,供AI学 ...

最新文章

  1. 天猫全球狂欢夜,我竟然被这个“不是人”的家伙给圈了粉!
  2. instanceof 实现
  3. 多进程python_python -- 多进程
  4. 【android】错误集锦及解决办法
  5. mybatis配置文件属性的详解和db.propertis文件的使用
  6. 抖音、微信读书都被诉侵权,法院这样判,但两者回应却不一样?
  7. #运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标VS指针...
  8. c语言玫瑰花图形程序,一个玫瑰花的程序
  9. 2007-2018年软考高级之系统分析师真题及答案解析
  10. 【算法与数据结构】—— 并查集
  11. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Incorrect database name ‘dongdong_1
  12. 磁盘清理 磁盘分析 磁盘空间 磁盘大小 可视化【软件】
  13. java实现清除图片水印_Java 添加、删除PPT文本和图片水印
  14. 基于SSM抑郁症自检测及初级自治疗网站的设计实现
  15. 地产AR模拟看房软件开发
  16. 论文笔记:Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering
  17. Ubuntu Desktop 更改默认应用程序 (Videos -> SMPlayer)
  18. 尊贵荣耀 诺基亚8系列手机回忆录
  19. 【CV实战】年轻人的第一个深度学习CV项目应该是什么样的?(支持13大深度学习开源框架)...
  20. 微信小程序页面跳转后不显示内容

热门文章

  1. Mybatis——返回类型为 集合嵌套集合 应该如何处理
  2. Oracle hang 之sqlplus -prelim使用方法
  3. 在Heroku上部署(托管)Rails项目
  4. MYSQL 表的修复(不断更新)
  5. 更新丨.NET 7 预览版2 中的 ASP.NET Core
  6. BeetleX服务网关流量控制
  7. .NET 运行时设置
  8. HTTP1.1 Keep-Alive到底算不算长连接?
  9. .NET Core 中如何调试 死锁 ?
  10. 看过这么多爆文,依旧走不好异步编程这条路?​