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

科技资讯 投稿 12900 0 评论

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

概述

ET框架消息结构

  • NetCompontent网络组件有Client客户端、Server服务器(Gate)、Inner内网服务等多态,进程业务使用网络组件进行通信,网络组件会对连接建立一个Secsiom会话对象,封装连接信息和相关操作

    • Channel对应一个Session连接,封装了对底层tcp等协议库的操作。
    • Service对应一个NetCompent组件,对应NetCompent管理多个Session,Server管理和调度一堆Channel的工作。
  • NetServices负责调度多个Service对象的在网络线程和主线程工作任务,ET开了网络线程处理网络相关,某些进程需要多个网络组件(比如Gate服务器同时需要Server、Inner网络组件,接收转发客户端消息)。

    • NetClientComponentOnReadEvent对应客户端Client,处理普通消息和RPC调用。
  • NetInnerComponentOnReadEvent对应服务器内网类型Inner,处理Actor消息
  • NetServerComponentOnReadEvent对应服务外网,处理Actor消息、RPC调用、普通消息

消息通信

以典型的TCP协议类型为例,其他实现类似,看图相信都能理解,不多赘述。有一些要注意的点:

    如上述,ET开了一个线程处理网络相关,一些工作使用了“生产-消费”Task任务这种方式。
  • 使用了异步Socket

TCP发消息

TCP收消息

多进程调用

先对相关技术做一个简介:

    Actor模型

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

    RPC

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

消息协议类型

如上图所示消息类型分为三种:

    Message 消息,无需应答
  • Request 请求,对应一个Response应答
  • Response 应答,对应一个请求

消息类型可以被前缀修饰,修饰有三种:

    None 客户端与服务器(Gate)之间不需要转发的消息。(注意这里不是修饰字符不是"None",而是""表示没有)
  • Actor 服务器内网之间的消息
  • ActorLocation 客户端与服务器需要转发的消息。

如这个登录到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模型 官方介绍

参考链接

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

编程笔记 » ET框架6.0分析三/网络通信

赞同 (66) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽