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緩存