ET框架6.0分析三、网络通信

这篇具有很好参考价值的文章主要介绍了ET框架6.0分析三、网络通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

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

ET框架消息结构

ET框架6.0分析三、网络通信

  • 结构图为了更加明确整体关系,进行了一定程度的简化,剔除掉了一些消息解包等一些细节

  • 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发消息

ET框架6.0分析三、网络通信

TCP收消息

ET框架6.0分析三、网络通信

多进程调用

ET框架在基础网络消息通信基础使用了Actor模型、PRC等相关技术思想(某些思想和实现有调整)进行了拓展,提供多个进程的互相调用机制。
先对相关技术做一个简介:

  • Actor模型

在计算机科学中,Actor模型(Actor model)是一种并发运算上的模型。“Actor”是一种程序上的抽象概念,被视为并发运算的基本单元:当一个Actor接收到一则消息,它可以做出一些决策、创建更多的Actor、发送更多的消息、决定要如何回答接下来的消息。Actor可以修改它们自己的私有状态,但是只能通过消息间接的相互影响(避免了基于锁的同步)

这是维基百科中对于Actor模型的描述,简单理解它就是提供了一种消息机制避免了基于锁的同步。一些经典的应用场景是多线程,在ET框架中它的应用场景是多进程,类似的它提供了一种机制:直接通过ID发消息,不用关心实例在哪个进程。

  • RPC

分布式计算中,远程过程调用(英语:Remote Procedure Call,RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统

RPC机制通过一些手段抹平了不同进程的差异,使得进程间的调用可以和本地异步调用一样处理。

了解了这两种技术,下面来看ET框架对其的应用和如何实现多进程调用的。

消息协议类型

ET框架6.0分析三、网络通信
如上图所示消息类型分为三种:

  • 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调用过程

ET框架6.0分析三、网络通信
如图所示,进行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模型 官方介绍文章来源地址https://www.toymoban.com/news/detail-482183.html

参考链接

  • 跳转链接: Actor模型介绍
  • 跳转链接: RPC介绍

到了这里,关于ET框架6.0分析三、网络通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《3.linux应用编程和网络编程-第8部分-3.8.网络基础》 3.8.1.网络通信概述 3.8.3.网络通信基础知识2

        进程间通信: 管道 、 信号量、 共享内存, 技术多,操作麻烦     线程就是解决 进程间 通信 麻烦的事情,这是线程的 优势 3.8.1.网络通信概述 3.8.1.1、从进程间通信说起: 网络域套接字socket , 网络通信其实就是位于网络中不同主机上面                   的 

    2024年02月15日
    浏览(53)
  • 基于RabbitMQ的模拟消息队列之六——网络通信设计

    自定义基于TCP的应用层通信协议。实现客户端对服务器的远程调用 编写服务器及客户端代码 1.请求格式 type:哪个方法 length:payload的长度 payload:调用的方法的参数 2.创建Request类 1.响应格式 type:哪个方法 length:payload的长度 payload:调用的方法的结果 2.创建Response类 0X1 创建chann

    2024年02月09日
    浏览(45)
  • 【全民Python】 Python网络通信UDP消息收发处理

    目录 一.UDP介绍 二.UDP的使用方法 三.源码 1. UDP的英文单词是User Datagram Protocol,缩写为UDP,是一种用户数据报协议,又称为用户数据报文协议,是一种报文的协议,是一个简单的面向数据报的传输层协议  。 2.UDP的发起和接受是不需要经过连接的,仅仅只需要发送在对应端口

    2024年02月15日
    浏览(33)
  • RPC分布式网络通信框架(二)—— moduo网络解析

    网络部分,包括寻找rpc服务主机,发起rpc调用请求和响应rpc调用结果,使用muduo网络和zookeeper 服务配置中心 (专门做服务发现) 其中MprpcApplication类负责框架的一些初始化操作,注意去除类拷贝构造和移动构造函数(实现单例模式)。其中项目还构建了MprpcConfig类负责读取服

    2024年02月17日
    浏览(47)
  • 网络基础与通信原理:构建数字世界的框架

    目录 初识计算机网络 网络介绍 按照拓扑分类 按地域分类 网络设备 交换机(switch) 路由器(router) 传输介质 双绞线 光纤 光纤速度 ISO ISO和OSI有什么关系呢? OSI七层模型 TCP/IP四层 TCP/IP协议族 C/S(客户端/服务器)案例 一句话搞懂 TCP协议 TCP协议-三次握手 TCP协议-三次挥手

    2024年02月21日
    浏览(42)
  • 通过redis学网络(1)-用go基于epoll实现最简单网络通信框架

    本系列主要是为了对redis的网络模型进行学习,我会用golang实现一个reactor网络模型,并实现对redis协议的解析。 系列源码已经上传github redis的网络模型是基于epoll实现的,所以这一节让我们先基于epoll,实现一个最简单的服务端客户端通信模型。在实现前,先来简单的了解下

    2024年02月08日
    浏览(38)
  • RPC分布式网络通信框架(一)—— protobuf的使用

    常见序列化和反序列化协议有XML、JSON、protobuf,相比于其他protobuf更有优势: 1、protobuf是二进制存储的,xml和json都是文本存储的。故protobuf占用带宽较低 2、protobuf不需要存储额外的信息。 json如何存储数据?键值对。例:Name:”zhang san”, pwd: “12345”。 protobuf存储数据的方式

    2024年02月16日
    浏览(52)
  • 七、Kafka源码分析之网络通信

    1、RecordAccumulator 将消息缓存到RecordAccumulator收集器中, 最后判断是否要发送。这个加入消息收集器,首先得从 Deque 里找到自己的目标分区,如果没有就新建一个批量消息 Deque 加进入 2、消息发送时机 如果达到发送阈值( 批次发送的条件为:缓冲区数据大小达到 batch.size 或者

    2024年02月15日
    浏览(27)
  • RPC分布式网络通信框架(三)—— 服务配置中心Zookeeper模块

    分布式系统存在的问题: 为了支持高并发,每个客户端都保存了一份服务提供者的 列表 。但是如果 列表 有更新,想要得到最新的URL列表(rpc服务的ip和端口号),必须要手动更新配置文件,很不方便。 如图所示,实例3挂掉了,但是 列表 并没有得到更新。 故需要动态的更

    2024年02月15日
    浏览(45)
  • 快速入门Java NIO(Not I/O)的网络通信框架--Netty

    了解netty前需要对nio有一定认识,该笔记基础来自bilinbili黑马,在此基础上自己学习的笔记,添加了一些自己的理解 了解java 非阻塞io编程 1.1 Netty 是什么? Netty 是一个异步(基于多线程)的、基于事件驱动(多路复用的那写事件驱动)的网络应用框架,用于快速开发可维护、高性能的

    2024年01月17日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包