ET框架6.0分析三、网络通信
概述
ET框架的消息机制贯彻始终,包含Entity消息(Awake,Update ...),自定义(Customer)消息,网络消息等。而ET系统的进程包含了客户端、Gate等各种类型的服务器,进程包含各种服务器客户端之间通过网络消息进行通信进行工作。
ET框架消息结构

结构图为了更加明确整体关系,进行了一定程度的简化,剔除掉了一些消息解包等一些细节
NetCompontent网络组件有Client客户端、Server服务器(Gate)、Inner内网服务等多态,进程业务使用网络组件进行通信,网络组件会对连接建立一个Secsiom会话对象,封装连接信息和相关操作
Service和Channel实现负责NetCompontent和Session的功能,有Tcp长连接、Web网页、KCP无连接可靠协议的多态(若不熟悉KCP协议,可以参考之前写的文章 跳转链接: KCP协议浅析)。
- Channel对应一个Session连接,封装了对底层tcp等协议库的操作。
- Service对应一个NetCompent组件,对应NetCompent管理多个Session,Server管理和调度一堆Channel的工作。
NetServices负责调度多个Service对象的在网络线程和主线程工作任务,ET开了网络线程处理网络相关,某些进程需要多个网络组件(比如Gate服务器同时需要Server、Inner网络组件,接收转发客户端消息)。
NetComponentOnReadEvent是不同类型网络组件的消息处理器。
- NetClientComponentOnReadEvent对应客户端Client,处理普通消息和RPC调用。
- NetInnerComponentOnReadEvent对应服务器内网类型Inner,处理Actor消息
- NetServerComponentOnReadEvent对应服务外网,处理Actor消息、RPC调用、普通消息
消息通信
以典型的TCP协议类型为例,其他实现类似,看图相信都能理解,不多赘述。有一些要注意的点:
- 如上述,ET开了一个线程处理网络相关,一些工作使用了“生产-消费”Task任务这种方式。
- 使用了异步Socket
TCP发消息

TCP收消息

多进程调用
ET框架在基础网络消息通信基础使用了Actor模型、PRC等相关技术思想(某些思想和实现有调整)进行了拓展,提供多个进程的互相调用机制。
先对相关技术做一个简介:
- Actor模型
在计算机科学中,Actor模型(Actor model)是一种并发运算上的模型。“Actor”是一种程序上的抽象概念,被视为并发运算的基本单元:当一个Actor接收到一则消息,它可以做出一些决策、创建更多的Actor、发送更多的消息、决定要如何回答接下来的消息。Actor可以修改它们自己的私有状态,但是只能通过消息间接的相互影响(避免了基于锁的同步)
这是维基百科中对于Actor模型的描述,简单理解它就是提供了一种消息机制避免了基于锁的同步。一些经典的应用场景是多线程,在ET框架中它的应用场景是多进程,类似的它提供了一种机制:直接通过ID发消息,不用关心实例在哪个进程。
- RPC
分布式计算中,远程过程调用(英语:Remote Procedure Call,RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统
RPC机制通过一些手段抹平了不同进程的差异,使得进程间的调用可以和本地异步调用一样处理。
了解了这两种技术,下面来看ET框架对其的应用和如何实现多进程调用的。
消息协议类型

如上图所示消息类型分为三种:
- Message 消息,无需应答
- Request 请求,对应一个Response应答
- Response 应答,对应一个请求
注意Request和Response一定成对定义,且其Message一定包含一个RpcId字段
消息类型可以被前缀修饰,修饰有三种:
- None 客户端与服务器(Gate)之间不需要转发的消息。(注意这里不是修饰字符不是"None",而是""表示没有)
- Actor 服务器内网之间的消息
- ActorLocation 客户端与服务器需要转发的消息。
修饰字符可以修饰任意消息类型,组合起来一共有9种消息。
如这个登录到Gate的协议:
//ResponseType G2C_LoginGate
message C2G_LoginGate // IRequest
{
int32 RpcId = 1;
int64 Key = 2; // 帐号
int64 GateId = 3;
}
message G2C_LoginGate // IResponse
{
int32 RpcId = 1;
int32 Error = 2;
string Message = 3;
int64 PlayerId = 4;
}
- C2G_LoginGate 在消息名后面注明了消息类型,并在消息名上面注明了应答包的消息类型,并且包含一个RpcId的字段,这些都必须的,表示这是个不需要转发的、需要应答的请求消息。而消息名前缀只是方便理解,起到注释的作用:表示这是Client进程发送给Gate服务器进程的消息。
- G2C_LoginGate 同上,是上述C2G_LoginGate请求的应答消息。
Rpc调用过程

如图所示,进行Rpc调用时,生成一个新的RpcID并带入请求包中,同时把调用信息存起来。对方应答时,会把请求包的RpcID传入到应答包中。在收到消息时如果是Resp类型消息会调用OnResp方法,通过应答包的RpcID取出RpcInfo,通过RpcInfo取消调用RpcCall函数的异步阻塞。
public static void OnResponse(this Session self, IResponse response)
{
if (!self.requestCallbacks.TryGetValue(response.RpcId, out var action))
{
return;
}
self.requestCallbacks.Remove(response.RpcId);
if (ErrorCore.IsRpcNeedThrowException(response.Error))
{
action.Tcs.SetException(new Exception($"Rpc error, request: {action.Request} response: {response}"));
return;
}
action.Tcs.SetResult(response);
}
action.Tcs.SetResult会取消异步的阻塞,执行await后面的语句,详情见之前写的文章 跳转链接: C#异步编程
Actor模型实现
在ET框架的设计中,Actor其实是一个带有MailboxComponent的组件。其具体的实现方式,ET有比较详细的文档说明,有实现思路和使用方式的介绍,这里贴出来,不做赘述。
跳转链接: ET Actor模型 官方介绍
参考链接
ET框架6.0分析三、网络通信的更多相关文章
- Spark RPC框架源码分析(三)Spark心跳机制分析
一.Spark心跳概述 前面两节中介绍了Spark RPC的基本知识,以及深入剖析了Spark RPC中一些源码的实现流程. 具体可以看这里: Spark RPC框架源码分析(二)运行时序 Spark ...
- Android网络通信Volley框架源代码浅析(三)
尊重原创 http://write.blog.csdn.net/postedit/26002961 通过前面浅析(一)和浅析(二)的分析.相信大家对于Volley有了初步的认识,可是假设想更深入的理解 ...
- Android Small插件化框架源码分析
Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...
- YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)
YII 框架源码分析 百度联盟事业部——黄银锋 目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 ...
- Android 图片加载框架Glide4.0源码完全解析(二)
写在之前 上一篇博文写的是Android 图片加载框架Glide4.0源码完全解析(一),主要分析了Glide4.0源码中的with方法和load方法,原本打算是一起发布的,但是由于into方法复杂性 ...
- Spark RPC框架源码分析(一)简述
Spark RPC系列: Spark RPC框架源码分析(一)运行时序 Spark RPC框架源码分析(二)运行时序 Spark RPC框架源码分析(三)运行时序 一. Spark rpc框架概述 S ...
- Spark RPC框架源码分析(二)RPC运行时序
前情提要: Spark RPC框架源码分析(一)简述 一. Spark RPC概述 上一篇我们已经说明了Spark RPC框架的一个简单例子,Spark RPC相关的两个编程模型,Actor模型和Re ...
- Hybrid框架安全隐患分析
Hybrid框架安全隐患分析 目前我司移动端项目中各种app如雨后春笋般生根发芽层出不穷.而利用Hybrid框架确实可以减轻一部分移动端压力.并且做到灵活发版.但是其中的安全问题往往让人忽略. 针对A ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
- Newbe.Claptrap 框架入门,第三步 —— 定义 Claptrap,管理商品库存
接上一篇 Newbe.Claptrap 框架入门,第二步 —— 简单业务,清空购物车 ,我们继续要了解一下如何使用 Newbe.Claptrap 框架开发业务.通过本篇阅读,您便可以开始学会添加一个全 ...
随机推荐
- laravel groupBy 分页
$model=DB::table('tablebname') ->where(function($query) use ($res){ $query->where('xx','xx'); ...
- Nginx + Keepalived 高可用集群部署
负载均衡技术对于一个网站尤其是大型网站的web服务器集群来说是至关重要的!做好负载均衡架构,可以实现故障转移和高可用环境,避免单点故障,保证网站健康持续运行.在使用 Nginx 做反向代理或者负载均衡 ...
- [极客大挑战 2019]Http 1
进入题目,可以看到是一个小型的网站 这里我也走了很多弯路,题目提示为HTTP,这里就可以在源码中找一些隐藏信息 搜搜.php可以看到有一个Secret.php 进入提示It doesn't come ...
- SpringBoot笔记--自动配置(高级内容)(上集)
原理分析 自动配置 Condition--增加的条件判断功能 来一个案例说明: 具体实现: 没有要求的话,就是这样的: Config.java User.java SpringLearnApplica ...
- Why WebRTC|“浅入深出”的工作原理详解
前言 近几年实时音视频通信应用呈现出了大爆发的趋势.在这些实时通信技术的背后,有一项不得不提的技术--WebRTC. 今年 1 月,WebRTC 被 W3C 和 IETF 发布为正式标准.据调研机构 ...
- 车企-TSP系统通用架构设计
最近一年用于参与到了新能源车企的管理系统的开发,并且主要从事架构设计与重难点功能开发的工作,因此有了一些小心得,特此记录(PS:整体和甲方在需求上扯皮,以及协调所有供应商这些项目管理上的事情比做开发耗 ...
- GPSSworld仿真(一):程序题——单窗口排队系统
3.3 一个仓库共存放了2000吨货物,货物以三种规模出库,少量(10吨),中等(20吨),大量(50吨),分别以10±5分,15分,30±10分的速率出库.如果没有货位达到的情况下,一个仓库能维持供 ...
- CSS 基础属性篇组成及作用
#### 学习目标- css属性和属性值的定义- css文本属性- css列表属性- css背景属性- css边框属性- css浮动属性##### 一.css属性和属性值的定义>属性:属性是指定 ...
- Out Of Memory 案例
案例一:老年代内存泄漏 某晚八点收到报警邮件,一看是OOM: 打开 hickwall查看指标:JVM各项指标中 老年代在持续增长(从上次发布10月30号到11月10号的 12天 一直在增长,存在内 ...
- 在 Rainbond 上使用 Curve 云原生存储
Curve 是网易主导自研的现代化存储系统, 目前支持文件存储(CurveFS)和块存储(CurveBS). CurveBS 的核心应用场景主要包括: 虚拟机/容器的性能型.混合型.容量型云盘或持久化 ...