• 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缓存

    关注开源 国内最早的Orleans群--174511582,欢迎大家加入
  • 相关阅读:
    C++ list<list<int> >类型的对象遍历
    Apache与Nginx服务器对比
    服务器重写技术:rewrite
    冒泡排序(python版)
    有k个list列表, 各个list列表的元素是有序的,将这k个列表元素进行排序( 基于堆排序的K路归并排序)
    堆排序(C++版)
    [转载] 单链表的相关操作
    TCP三次握手连接与四次握手断开
    [转载] TCP与UDP对比
    进程与线程的联系与区别
  • 原文地址:https://www.cnblogs.com/liwt/p/orleans-message-route.html
Copyright © 2020-2023  润新知