Orleans 客戶端請求的消息流轉以及消息在Silo中再路由機制


1.客戶端是一個OutSideRuntimeClient,在這個客戶端類中有一個消息代理中心transport(類型為ProxiedMessageCenter)

2.ProxiedMessageCenter通過取模,將消息請求負載到Silo集群中(即不同的GatewayConnection中)

3.消息首先進入負載得到的GatewayConnection的請求隊列中(requestQueue)

4.GatewayConnection實例中具有特定的Silo地址和Socket實例,最終通過這里的Socket將消息發送出去,消息發送之前首先進行序列化

5.Silo收到消息后,首先根據請求的GrainId查找本地的GrainActivation,如果對應的Activation激活在本地,則將請求路由到這個Activation進行處理

 

這里對Silo收到消息后的處理進行一些詳細的描述:

首先,Silo並非持有所有Actor的地址信息,Silo持有本地的Actor Activation的數據字典和一個非本地Silo持有Actor Activation的一個地址映射緩存字典.

  Silo對消息進行路由的過程分為以下3步

       1.查找本地的Actor Activation數據字典,如果找到了,直接路由到本地的Actor Activation進行消息處理

       2.如果本地的Actor Activation數據字典中沒有這個Grain,則查找緩存字典,找到后根據字典中的Silo地址,然后將消息路由到對應的Silo

       3.如果緩存中也沒找到,會根據GrainId,通過Consistent Hash來獲得目標Silo,進行遠程的Silo查找GrainId對應的激活,然后保存到本地的緩存字典中

 

單個Silo中的Actor Activation地址更新,LocalGrainDirectory通過實現SiloStatusChangeNotification,監聽Silo的Stop消息,得到消息后,刪除本地緩存中所有在這里Silo的Actor地址緩存

 

綜上,總結:

      1.單個Silo並非持有所有Actor的地址

      2.Silo之間的Actor地址無需同步,只在查找時添加緩存或在查找得知Activation不可用時刪除緩存,以及在得到Other Silo停止時,刪除所有對應Silo的Actor Activation緩存


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM