在学习这个源码前,先去看看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的结果,记录发送消耗时间,最后返回返回的结果