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 客户端请求的消息流转以及消息在Silo中再路由机制的更多相关文章

  1. JAVA获取客户端请求的当前网络ip地址(附:Nginx反向代理后获取客户端请求的真实IP)

    1. JAVA获取客户端请求的当前网络ip地址: /** * 获取客户端请求的当前网络ip * @param request * @return */ public static String get ...

  2. 快速入门:弄懂Kafka的消息流转过程

    大家都知道 Kafka 是一个非常牛逼的消息队列框架,阿里的 RocketMQ 也是在 Kafka 的基础上进行改进的.对于初学者来说,一开始面对这么一个庞然大物会不知道怎么入手.那么这篇文章就带你先 ...

  3. 弄懂Kafka的消息流转过程

    原文地址:https://www.cnblogs.com/chanshuyi/p/quick_start_of_kafka.html 大家都知道 Kafka 是一个非常牛逼的消息队列框架,阿里的 Ro ...

  4. 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装

    微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...

  5. “一切都是消息”--MSF(消息服务框架)之【请求-响应】模式

    在前一篇, “一切都是消息”--MSF(消息服务框架)入门简介, 我们介绍了MSF基于异步通信,支持请求-响应通信模式和发布-订阅通信模式,并且介绍了如何获取MSF.今天,我们来看看如何使用MSF来做 ...

  6. 允许asp.net MVC报 错说明: 访问服务此请求所需的资源时出错。服务器可能未配置为访问所请求的 URL。错误消息 401.2。: 未经授权

    运行mvc3程序报以下错误 详细报错如下: “/”应用程序中的服务器错误. 访问被拒绝. 说明: 访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未 ...

  7. Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装

    在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回xml格式及实体类的封装. ( ...

  8. DirectUI的消息流转

    Windows是一个基于消息循环的系统,DirectUI同样遵循这样的消息流转.当界面呈现.用户点击.定时器等各种各样的消息一旦进入windows消息循环队列,系统自动调用该窗口的WndProc过程. ...

  9. C# HttpWebRequest请求远程地址获取返回消息

    HttpWebRequest请求远程地址获取返回消息 /// <summary> /// 请求远程Api获取响应返回字符串 /// </summary> /// <par ...

随机推荐

  1. SQL Server 查询所有外键子父表关系

    SELECT table_name,fk_name,reference_table_name,fk_list_number,fk_detailFROM (SELECT object_name(f.ob ...

  2. mount: unknown filesystem type 'ntfs'

    mount: unknown filesystem type 'ntfs' 问题描述 # mount –t ntfs /dev/sdc1 /mnt/usb2 mount: unknown filesy ...

  3. 腾讯OAuth授权联合登录

    /** * unionLoginCallbackPath */ @Value("${QQ_UNION_LOGIN_CALLBACK_PATH}") private String q ...

  4. mysql中的where和having子句的区别

    mysql中的where和having子句的区别 having的用法 having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句 ...

  5. final

    final的变量的值不能被改变.(包括形参) final的方法不能被重写. final的类不能被继承.

  6. ZKM混淆工具

    原创文章,尊重劳动,转载请标明出处 ZKM 介绍 一般使用步骤 直接使用 ZKM 脚本 使用 GUI 工具混淆,同时生成 ZKM 脚本 参考 ZKM 介绍 zkm 是一款付费的代码混淆工具. 一般使用 ...

  7. SSE and Websocket

    http://www.w3school.com.cn/html5/html_5_serversentevents.asp http://javascript.ruanyifeng.com/htmlap ...

  8. C# 计算字符串在控制台中的显示长度

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  9. java加密解压类库

    java压缩类库_支持加密解压.zip public static void unzip(File zipFile, String dest, String passwd) throws ZipExc ...

  10. 在Xcode 6 beta里编译Cocos2d-x iOS项目时失败

    转载 在Xcode 6 beta里编译Cocos2d-x iOS项目时可能会失败,提示如下错误: Undefined symbols for architecture i386: "_fwr ...