在學(xué)習(xí)這個源碼前丐枉,先去看看ETBook上的Actor模型和Actor Location文章
ETBook Actor筆記
- ET是單線程多進(jìn)程架構(gòu),不需要重寫一套Profiler工具历恐,不需要考慮多臺物理機(jī)問題,缺點是消息跨進(jìn)程傳輸需要序列化及反序列化甫煞。
- 多線程開發(fā)對于公共變量的訪問需要加鎖来颤,會變得很難維護(hù)
- Actor模型是服務(wù)器消息通信機(jī)制和客戶端是沒有什么關(guān)系的。ET客戶端使用這個Actor完全是因為Gate需要對客戶端消息進(jìn)行轉(zhuǎn)發(fā)囤躁。
在學(xué)習(xí)InnerMessageDispatcher中對于IActorResponse分發(fā)時利用了ActorMessageSenderComponent的RunMessage冀痕。這節(jié)來看ActorMessageSenderComponent組件
先看消息處理類,這2個和上一節(jié)的AMHandler和AMRpcHandler很相似
只不過參數(shù)從Session變成了Entity
屬性中提到了超時時間狸演,存放ActorMessageSender的及字典言蛇,已經(jīng)超時的發(fā)送者等
ActorMessageSender
ActorMessageSenderComponent組件發(fā)送普通Actor消息
先看Awake,發(fā)現(xiàn)調(diào)用了TimerComponent的NewRepeatedTimer宵距,這個方法是每隔1000ms執(zhí)行一次Check
下面看看Check方法腊尚,可以看到主要是將超時的ActorMessageSender清除并設(shè)置超時Resp
Run函數(shù),可以看到本質(zhì)就是設(shè)置ActorMessageSender中將來要完成的任務(wù)Tcs的值满哪⌒龀猓或者拋異常
這個函數(shù)就是在消息分發(fā)時對IActorResponse的處理
Send函數(shù)和Call函數(shù)
去NetInnerComponent拿到Session并發(fā)送,這個NetInnerComponent.Get沒有找到將會去StartProcessConfigCategory拿到對應(yīng)的數(shù)據(jù)哨鸭,這個這一個配置
然后看Call
GetRpcId(this ActorMessageSenderComponent self)方法會執(zhí)行++self.RpcId
每次發(fā)送自增RpcId民宿,消息轉(zhuǎn)化成stream
往下繼續(xù)跟Call,ETTask對象池創(chuàng)建一個Tcs兔跌,然后加入字典requestCallback中勘高,然后調(diào)用上面的Send方法峡蟋。
最后開始等待Tcs的結(jié)果坟桅,記錄發(fā)送消耗時間,最后返回返回的結(jié)果