ET源码学习(十一):ActorMessageSenderComponent

在学习这个源码前,先去看看ETBook上的Actor模型和Actor Location文章

ETBook Actor笔记

  • ET是单线程多进程架构,不需要重写一套Profiler工具,不需要考虑多台物理机问题,缺点是消息跨进程传输需要序列化及反序列化。
  • 多线程开发对于公共变量的访问需要加锁,会变得很难维护
  • Actor模型是服务器消息通信机制和客户端是没有什么关系的。ET客户端使用这个Actor完全是因为Gate需要对客户端消息进行转发。

在学习InnerMessageDispatcher中对于IActorResponse分发时利用了ActorMessageSenderComponent的RunMessage。这节来看ActorMessageSenderComponent组件


先看消息处理类,这2个和上一节的AMHandler和AMRpcHandler很相似
只不过参数从Session变成了Entity





属性中提到了超时时间,存放ActorMessageSender的及字典,已经超时的发送者等



ActorMessageSender



ActorMessageSenderComponent组件发送普通Actor消息
先看Awake,发现调用了TimerComponent的NewRepeatedTimer,这个方法是每隔1000ms执行一次Check



下面看看Check方法,可以看到主要是将超时的ActorMessageSender清除并设置超时Resp



Run函数,可以看到本质就是设置ActorMessageSender中将来要完成的任务Tcs的值。或者抛异常
这个函数就是在消息分发时对IActorResponse的处理



Send函数和Call函数
去NetInnerComponent拿到Session并发送,这个NetInnerComponent.Get没有找到将会去StartProcessConfigCategory拿到对应的数据,这个这一个配置



然后看Call
GetRpcId(this ActorMessageSenderComponent self)方法会执行++self.RpcId
每次发送自增RpcId,消息转化成stream



往下继续跟Call,ETTask对象池创建一个Tcs,然后加入字典requestCallback中,然后调用上面的Send方法。
最后开始等待Tcs的结果,记录发送消耗时间,最后返回返回的结果



©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容