当前课程知识点:游戏程序设计 > 第十四章 《分布式系统设计 》 > 14.2 进程间通信(下) > 14.2 进程间通信(下)
这里简单的我们先列一下大纲
就会有几个方面
我们必须要考虑
第一个问题就是说
进程间的通信
和通信的格式
并发模型和超时处理
这四部分
这是我们这部分的一个重点
进程通信
什么叫进程通信
在我们前面提到就说分布式网络的一个核心组件
就是它会有
一些软件的一个组件来进行配合
通过网络进行通信来配合和协作完成任务
那么
这就是各个节点上面部署的软件组件
那么如果
从程序的角度来讲
它就是一个个的一个独立的进程
这个进程的话
它就是我们平常所说的服务器程序
那么这些程序之间
它需要有自己的一个通讯方式
拿一个那个生活中的例子举个例子
生活中的例子来看的话就是我们
生活中的一个
所谓写信
当然现在现在的话
我们大家都已经习惯于通过
手机
通过E-mail通过电话来进行沟通
那么再往前20年的话
甚至到可能到父辈
那个时候大家还没有什么手机
通讯的时候基本上大家可能
通信就靠写信或者是电报
那么假如说我们再回到当时那个场景
我们现在要去
写一封信给某个人的话
那我们会有很多东西
很多种维度的一些选择
第一个维度就说我们的信怎么送出去
这是一个问题
可以选自己送吧
我知道这个我送给谁
她的地址在哪
我可以自己送过去
第二种的是我交给邮局
让邮局的网络区域帮我们送
寄送这封信
那么这封信很关键的信息什么
像接收方的地址
我们必须要有谁来接收
接收方的地址是哪里
同时我们还要有发送方的地址
因为方便
别人收到信之后要给我们回信
还有就是这封信我们如何包装
我们是直接把信纸直接就送过去
还是说我们放在信封里面
还是说我们拿本书夹它一下
对吧
把这本书快递过去
那么同样的道理
那信里面的内容
我们要考虑我们到底是直接用明文写
我们是用
比如说中文写英文写对吧
怎么写
还有比如说可能
还有莫尔斯电码对吧
会不会加密
之后再把这封信送过去
那么我们需要
虽然我们生活中确实不会那么复杂
但是如果拿它来考虑的话
就是我们有不同的维度
真的去思考的话
其实有很多种维度啊
大家现在这个场景不熟悉
我相信
写过情书的同学可能对这个场景会更加的熟悉一点
对吧会不会用到其中的某些场景
前面提到的通信
那么通信的话需要走到网络
那么我们涉及到一个网络编程的一个知识
那么网络编程我们其实有
如何去实现
我们前面说的进程之间的通信
那么其实也有两种方式
第一种方式就说我们利用操作系统
提供的API
就是我们说SOCKET API
其进行一个自己来实现
通过操作系统底层提供了一些API的机制
来做到通信
那么这一块需要自己去
写大量的代码就实现了
那么这个涉及到比如游戏客户端
跟服务器店的通信
还有服务器跟第三方服务
他们之间的通信
都需要去处理
还有另外一种方式
就是说我们可以选择
不用自己去做
我们可以用网络中间件
就是我们说的消息队列
去帮我们完成这块的事情
那么像腾讯
腾讯游戏
它自己的自研的消息中间件叫Tencent TBUS
后面我们会讲到
那么这两种方式
可以类比于我们前面讲的就是
线下送信的一个是自己送
左边的SOCKET编程
相当于我们自己送
因为做了代码
都要自己去写
自己去处理其中的一些问题
那么右边的网络中间件就相当于
我托管给了中间件
让他们来帮我们实现
那这样的话就相当于
相对于是第二部分
就是这样
也许像一个邮局系统
它已经帮我做好了
那既然提到消息队列的话
那我们可以看看
消息队列的一个定义
那就是消息队列是专门来负责消息传递的
通用的一个中间件
它就是功能比较单一
就是发送方
会把要发的数据
叫消息吧
通过对应的API接口
丢给了消息队列
消息队列会帮你去做存储
转发路由
各种各样的事情最终保证它
会被投递给接收方
那么
至于接收方到底在哪里
部署在哪台机器上面
是什么样的网络上面
发送方都不用关心
我只要告诉
目的方是谁就可以了
那这样的话它有些特点
它可以把消息的发送方和接收方
进行一个解耦
互相之间可以不用知道对方的一个实际的存在
或者知道他存在并且它的地址是什么就OK了
那么还要
会有比较好的一个稳定和可靠性
另外
它的性能通常会比较高
因为它的功能比较单一
它可以在这里做到大量的优化
这就是我们用消息队列的一个好处
那么对于消息队列
实际上是有业界
有非常多的开源的这些实现
每一个都有自己的优点和缺点
以及它擅长的地方
那么这一块我们
在课上因为时间有限
所以大家感兴趣
可以在课下去针对于
业界比较流行的
一些中间件
进入一个深入的学习和使用
这里的话
我会重点讲一下腾讯游戏自己的
一个通信方案
那么它的系统叫TBUS系统
什么叫TBUS
TBUS就是说
我们知道每一个
分布式系统里面最小的一个单元的话
如果定义到程序级别
那就是一个进程
那么每个进程
他其实我们需要标记它
标记它到底如何来识别
和找到这个进程
那么这里面的我们用一个叫TBUS地址
TBUS地址是一个点分十进制的一个表示方式
它的定义的话会是
World Zone Func Instance
这个四个维度
那么举个例子来讲
就是说
比如说大家在玩游戏
可能说微信
大家会问你在哪个区啊
对吧
大家在玩的时候都会问你在哪个区
你可能会告诉朋友说我在微信一区
那么这里面的微信其实就是一个World
因为它是微信
还有另外一World可能是叫QQ对吧
还有可能叫游客模式
那个区
那么一区就是我们说的Zone
还有那么Func
其实就代表了你的一个进程
它的功能
比如我们的功能是一个PVP战斗进程的话
那么它可能
这个Func比如ID等于一
那么它代表的其实是
微信一区里面的PVP的战斗进程
它专门负责处理战斗的
那么还有个Instance
那么你处理战斗的可能只有一组
因为单个战斗的一个程序进程
它可能能力有限那我们其实分布式里面
它会是一组
每组唯一的它每一个都有个唯一编号
那比如说编号是一
那么就是一号
那么如果说我们简单类比的话
那可能就说微信一区的一号战斗服务器进程
战斗的进程
就是这又是一个TBUS进程
对于TBUS的一个编码
它可以标识到唯一的一个进程
这里我们看一个例子吧
就是说
我们图上它也可以看到
上下两部分
上半部分和下半部分分别是一台实体的
一个物理机器
在这上面
我们部署了一些
两个业务进程
进程A和进程B
他们是在两台机器上
那么A和B之间
它是需要有通信和配合的
比如说
A现在要发一个消息给B
发给B
那么它如何把这个消息投递出去了
那么在TBUS系统里面
大家可以看到
这边的虚线
它实际上是一个虚拟的
并不存在的
实际上
他的消息发送
A会发给一个叫TBUSD的一个进程
这个TBUSDA
我们把它叫做TBUSDA
进程A和TBUSDA它是在同一台机器上
那么TBUSDA收到
进程A发过来的消息之后
它会去把这个消息转给B机器所在的TBUSD
我们把它定义为B的话
那么就相当于是TBUSD之间
会有一个消息的转化
同时B进程所在的
它物理机上的TBUSD
收到消息之后
会通过TBUS的channel转给进程B
所以这样的话我们就看到
比如说A和B之间的一次通信过程
变成了A到本机的TBUSD
在从本机的TBUSD到B所在的TBUSD
最后从B的TBUSD然后转到进程B
那么这是一个一次通信过程完成
那么
就通过这种方式
就建立起来了
A跟B之间的一个
通信的一个通道
大家可以在这里可以看到就说
A
发消息的时候
它需要知道什么呢
它只需要知道进程B的一个
TBUS地址
就可以了
那么按照这里的例子来讲的话就是
进程A发给B
只要知道B的地址就OK
那么它怎么做到的
A只要知道B的地址就可以发送过去呢
前面我们看到它的详细过程
大家应该能够分析的出来
最关键的关键点在于TBUSDA
它要能知道
B到底在哪台机器上对吧
同而能找出对应的TBUSD把消息投递
那么这里面就有两个很重要的因素
第一个就是刚才说的
TBUSD如何知道一个进程
在哪台机器上
同时还需要知道这台机器上TBUSD的地址
到底在哪里
那么
这两个核心的信息
我们是通过叫GCIM和GRM
这两套工具这两个配置
它其实是一个配置管理工具
通过它来知道的
那我们看看它到底在做什么事情
这里是GRM
GRM是指路由配置信息
全局的路由配置
那么刚才提到TBUSD需要把A发过来的消息
转给另外一台物理机的时候
那么它需要有一个配置信息
告诉TBUSDA说
B所在的进程
所在的机器的TBUSD的IP和端口
这里大家可能会有点熟悉呢
就是说网络编程里面大家都会想到
我需要知道对方IP
需要知道对应的程序的端口
那么它的配置是在这里
A是不需要知道
但是TBUSD是需要知道的
那么TBUSD就是通过
就是通过这样的配置信息
来找到我应该把消息发送给谁
那么第二个问题TBUSD
收到消息之后怎么知道转发给
我这台他所在的那台物理机上的
哪个进程
那个或者叫我们前面提到的进程B呢
因为可能这台机器上署了很多进程
可能有除了进程B还有C还有D
那么这个时候它需要
通过GCIM的一个配置
来找到进程B
所在的一个TBUS chancel的一个
标识
对于我们叫shmid
它其实是一个共享内存的
共享内存的一个ID
那么通过这个的话
我们就能找到TBUS chancel
TBUS chancel
然后通过TBUS chancel
把消息转发过去
那到这里的话
大家可能又会注意到
就说TBUS chancel在里面
也是扮演一个很关键的
一个信息
一个很重要的一个位置
因为它是本机内部的各个进程之间
通信是走的TBUS chancel
其实它是一块共享内存
大家都知道共享内存是
由操作系统来管理的
统一来管理的各个进程
可以之间共享
读到同一块地一个共享内存
那么这个的channel
它的信息分为三部分
第一部分叫
Control信息
给你是它的一个控制
一些控制的和关键信息在里面
剩下两个会有两个queue
两个队列对吧
这个队列而且是一个环形的一个队列
那么大家从这个图上可以看到一个
很明显的标识
就是AB两个程序
他们之间建立起来的这个TBUS channel
这两个
两个队列环形队列是不同的
比如说我们看到
A只会去写上面那个队列
同时上面那个队列只会被B来读
所以可以看的到
A写第一个
但反过来B来写消息的时候
它只会写下面的一个
但同时
这个是被A来读
所以大家可以看到
这两个队列
实际上大家是有分工的
一个是A来写B来读
另外一个是B来写
A来读
都可以
这是我们计算机程序里面的一个生产者
消费者模型里面的
单生产者单消费者模型
这样的模型其实是一个非常简单的
而且可以需要无锁化的
不需要锁来去
进行保护的
那个简单的一个团队里它的
性能会非常强
因为他不需要去做锁不需要做同步
这是
channel它的一个实现的原理
TBUS它如何进行跨界通信
如何利用TBUSD
加上GC GRM来做跨界路由
同时再利用了GCIM
来做本机的这个寻址
它屏蔽了这个部署上的一个细节
刚才前面提到发送方和接收方
他不需要知道对方到底在哪里
你具体部署在什么机器
这台机器到底放在什么机房对吧
甚至是不是在同一个地方
它们不太关心
而且我们用TBUS地址来替代了
传统上的IP和端口
那这样的话
它在
当一台机器的
一台机器出现故障
前面提到一台机器它
是有一定的故障率的
这台机器出问题了之后换了一台机器去
那么一台物理机器
那么它的IP地址可能发生变化
但是它的TBUS地址是不会变的
只是底层的映射关系发生了变化
所以这个他对上层的应用层是没有影响的
或者要基本上很少影响
不需要部署
不需要改部署结构
那么还有一个就是程序
它重启的时候影响很小
因为它网络层已经被TBUSD托管了
那么它不需要去把连接断开再建立的整个过程
它也不会把
网络链接中未处理的消息给丢掉
同时它也还有快速恢复
因为他从共享内存里面可以继续去
读消息进行处理消息
同样的话
它可以做到性能比较强
因为它整个都是无锁化的一个实现
然后存内存的一个操作
这个是一个
TBUS系统作为一个网络中间件
构建各个进程之间的
一个通信网络
-1. 1什么是游戏(上)
--选择题
-1.2 什么是游戏(下)
--选择题
-1.3 游戏是如何开发出来的
-1.4 游戏引擎(上)
-1.5 游戏引擎(下)
--单选题
-1.6 如何成为一个游戏开发者
--多选题
-2.1 什么是游戏服务器
--单选题
-2.2 游戏服务器的和分类发展
--单选题
-2.3 核心技术和实现难点
--单选题
-2.4 设计原理与方法论
--单选题
-3.1 三维坐标系统
--多选题
-3.2 向量与运算
--单选题
-3.3 矩阵与线性变换
--双选题
-3.4 四元数
--3.4 四元数
--多选题
-4.1 游戏循环概述(上)
--多选题
-4.2 游戏循环概述(下)
--单选题
-4.3 《无尽之路》的实现
--单选题
-4.4 支撑游戏的功能
--选择题
-4.5 支撑游戏的机制与系统
--多选题
-5.1 基本介绍
--5.1 基本介绍
--单选题
-5.2 随机数生成器
--单选题
-5.3 随机数分布与应用
--单选题
-6.1 什么是游戏玩法开发
--单选题
-6.2 建立愿景 Vision
--单选题
-6.3 划定边界 Scope
-6.4 迭代 Iteration
--单选题
-6.5 迭代 Iteration+抛光Polish
--单选题
-7.1实时图形渲染管道 宏观渲染系统
--单选题
-7.2实时图形渲染管道 应用阶段
--单选题
-7.3实时图形渲染管道 几何阶段
--单选题
-7.4实时图形渲染管道 光栅化阶段
--单选题
-7.5实时图形渲染管道 总结 参考
-8.1 物理回顾1
--单选题
-8.2 物理回顾2
--单选题
-8.3 材质 1
--8.3 材质 1
-8.4 材质 2
--8.4 材质 2
-8.5 材质3
--8.5 材质3
-8.6局部光照
--8.6局部光照
--单选题
-8.7 全局光照
--8.7 全局光照
--单选题
-9.1 动画介绍
--9.1 动画介绍
--多选题
-9.2 游戏动画介绍
-9.3 动画技术类型
--多选题
-9.4 骨骼蒙皮动画
--多选题
-9.5 动画流水线
--多选题
-9.6 动画前沿趋势
--多选题
-10.1 .基本概念
--多选题
-10.2 设计目标
--多选题
-10.3 传输数据分析
--多选题
-10.4 常用同步方案 1
-10.4 常用同步方案 2
-10.4 常用同步方案 3
-10.4 常用同步方案 4
--多选题
-10.5 方案对比
--多选题
-11.1 基本图元
--单选题
-11.2 图元距离(上)
--单选题
-11.2 图元距离(下)
--单选题
-11.3 图元相交测试+ 其他几何方法
--单选题
-12.1 著名物理引擎介绍
--单选题
-12.2 物理引擎原理(上)
--单选题
-12.3 物理引擎原理(下)
--单选题
-12.4 游戏中的物理体
--单选题
-12.5 物理引擎使用入门
--单选题
-13.1开发语言
--13.1开发语言
--单选题
-13.2 开发环境
--单选题
-13.3 腾讯开发组件介绍
--单选题
-13.4 网络通信+业务框架介绍
--多选题
-14.1 进程间通信(上)
-14.2 进程间通信(下)
-14.3 通信格式
-14.4 并发模型
-14.5 超时处理
-14.6 大系统小做(上)
--多选题
-14.7 大系统小做(下)
-14.8 架构层面的技术支持(上)
--单选题
-14.9 架构层面的技术支持(下)
-14.10 分布系统的关键能力
--多选题
-15.1 游戏人工智能综述
-15.2 人工智能在游戏中主要方法 上
--多选题
-15.3人工智能在游戏中主要方法 (下)
-15.4 人工智能在游戏制作中的应用领域1
--多选题
-15.5 人工智能在游戏制作中的应用领域2
-15.6 人工智能在游戏制作中的应用领域3
--多选题
-15.7 人工智能在游戏运营中的应用实践(上)
-15.8 人工智能在游戏运营中的应用实践(下)
--多选题
-16.1 游戏支撑系统(1)
--单选题
-16.2 游戏支撑系统(2)
--单选题
-16.3 游戏支撑系统(3)
--单选题
-16.4 游戏支撑系统(4)
--单选题
-16.5 游戏支撑系统(5)
-17.1 游戏逻辑服务器(上)
--单选题
-17.1 游戏逻辑服务器(下)
-17.2 外挂与反外挂(上)
-17.2 外挂与反外挂(下)
--多选题
-18.1运行环境
--18.1运行环境
--多选题
-18.2物理部署
--18.2物理部署
--多选题
-18.3系统的可运维性
--多选题
-18.4运维案列分析
--多选题