realtek audio console无法连接rpc服务_RPC服务在游戏中的简单运用

作者:二周目赤

出处:https://www.cnblogs.com/cr1719/p/13866841.html

我们最开始做的游戏框架,多数都是client—>server—>db的模式,但是随着玩家数量的增加,一个server进程就会扛不住,需要多个进程服务于多个玩家。但是给定了不同进程的玩家,有可能需要交互,这就导致了client与server端的连接,有可能是o(1),但也可能是o(n)连接,o(n)的扩展性非常差,不容易维护,因此可以剔除了。但是如果只保持o(1),那必然要引入新的抽象服务,网关也就登场了。下图是一个简单的网关部署架构:

9c0815d3073ad6c9038e57f662fc3a65.png

网关的引入,有哪些改变呢?

  • 内外网解耦,在保持客外网客户端不变的情况下,可以通过这个中间层调整内网服务的实现
  • 规范化,由于请求是网关统一接受和分发的,会直接促使客户端在发送和接受请求时规范化
  • 安全,由于网关具有收口作用,所有的安全问题都可以在这里解决,保护内网,比如反爬,认证等功能
  • 限流熔断,在网关上实现限流,避免内网被突发流量压垮
  • 统一的监控告警平台

有了网关后,开始在下游增加业务逻辑,可能我们会把所有的业务都耦合成一个service,比如聊天挂了,派系挂了,场景挂了,都可能会对有戏本身产生影响;基于此,不得不考虑拆分进程,之前的游戏service服务,可能会被拆分为多个服务,但是对于大多数的游戏开发人员来说,基于服务的开发,比基于进程的开发,也难的多,如果不是领导推进,也不会有人愿意把聊天做成一个单独的服务。

对于游戏来说,服务拆分最最极端的情况,就是一个消息cmd对应了一个service,但是这种情况会导致service越来越多,无法维护的程度,实际上游戏拆分也确实没有必要。不过服务service越来越多,某个service甚至处于内存,cpu瓶颈的状态,应该如何解决呢?这时候rpc的服务治理派上了用场。我们对上面的图示做下改动:

3899ea6a301a1c871f730891a0d07deb.png

game-rpc的引入,解决了哪些问题呢?

  • 开发人员不再需要关注内部通信机制,减少项目开发时间,降低成本
  • 强大的集群容错,负载均衡能力等,保证每次调用都能路由到合适的节点

service与service做成了集群,每个service启动后,往zk或nacos注册中心注册自己的url。gateway在启动后,订阅zk注册中心的service列表,依托于rpc本身强大的集群,负载等功能,可以自动实现service的切换。

在针对rpg等长连接游戏类型时,玩家在场景中的移动都需要同步,广播给周围的玩家,但是rpc是单通道的,不能回传,这应该如何处理呢?

有借于此,game-rpc增加了全双工的概念,不仅仅是client对service的请求,同时service也可以根据uniqueId,进行主动推送。于是上面的流程图变成了下面这样:

3df70a20310642e44c7eec18eab4122f.png

一切看上去都很完美,似乎没有问题了,然而新的问题随之出现。

我们知道,优秀的架构体系中,单点问题是不能容忍的,很不幸,我们的gateway,就出现了单点。随着玩家数量的增加,整个服务都会处于不可用的状态。于是网关需要拆成集群的模式,新的架构图显示如下:

81fda08b06f0c3215769f32a1f6beffa.png

网关拆分后,gate1和gate2的玩家是两个tcp长连状态的服务,无法交互,这应该怎么办?

我们参照了现行市面上比较常用的tcp网关做法,消息下行通知的解决方案,目前框架支持了两种方式:

  • MQ广播机制,当某台网关服务器收到广播消息后,MQ通知给集群内的所有gate server,每个gate在收到消息后,判断要推送端的消息是否是当前gate所持有的会话,如果在当前服务,则进行推送,否则抛弃
37c9846431f5b3a821d874d109a8c41e.png
  • redis session共享,针对MQ的广播机制,如果以后游戏火爆,同时有百万玩家在线,那么gate集群里的机器,可能会达到上百台不等,如果每个消息都需要MQ广播,有可能会导致信号风暴,于是我们调整了最后一种解决方案。玩家在登录网关,认证成功后,把玩家id作为key,当前连接的网关uniqueId作为value,存储到redis集群中。网关随后把消息路由到具体某个service,service从redis集群里获取到需要广播的玩家对应的gate服务,service通过rpc消息下行,直接推送到具体的gate,再由gate转发到client
e5a0023e92e6acd1ebd7c861485dcb09.png

说明:这种架构,更适用于全区全服类型的游戏。目前我们已经有多款线上游戏使用。

作者:二周目赤

出处:https://www.cnblogs.com/cr1719/p/13866841.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux查询.gz日志,linux2-查日志

1.tail 显示文件内容的最后几行tail catalina.out查最后10行tail -f filename输出最后10行内容,同时监视文件的改变,只要文件有一变化就显示出来。tail -n 5 filename 或者 tail -5 filename输出文件最后5行的内容tail -nf catalina.out输出文件最后n行的…

linux qt yuv,c – 如何使用Qt中的RGBA32数据将带有YUV数据...

我找到了一个内置于Qt5的解决方案,但是不受Qt的支持.以下是如何进行的:>将QT multimedia-private放入qmake .pro文件中>将#include“private / qvideoframe_p.h”放入代码中以使该功能可用.>您现在可以访问具有以下签名的函数:QImage qt_image…

union all会影响性能吗_哪些因素会影响悬臂式掘进机的性能?

悬臂式掘进机性能的好坏是决定快速掘进的关键,已有成果的基础上,对影响悬臂式掘进机性能的主要因素进行了综合分析。下面小编就具体说明一下:1.截割头、截齿的影响因素截齿是掘进机的关键部件,其材料和制造技术对悬臂式掘进机的性…

自制简单的小型Linux,自制小型Linux系统

<div id”content” contentScore”949″>自制小型Linux系统【详细步骤】1&#xff1a;找一个新的SCSI接口的Hard Disk 装载到Linux虚拟机上(/dev/sdb),加电。fdisk /dev/sdb 进行分区&#xff0c;格式化。2&#xff1a;建立2个挂载点,并分别挂载。3&#xff1a;构建MBR引…

numpy序列预处理dna序列_合成生物学快讯2019年第12期:基于DNA的分子数字数据存储...

本文由中国科学院上海生命科学信息中心 战略情报团队供稿基于DNA的分子数字数据存储:现状与挑战编者按&#xff1a;美国华盛顿大学和微软研究院的研究人员2019年8月在Nature杂志发文&#xff0c;对基于DNA的分子数字数据存储进行总结&#xff0c;梳理了该领域的研究发展历史、D…

c语言编程游戏开代码错误,[蓝桥杯][历届试题]数字游戏 (C语言代码)(兄弟们帮我看一下为什么运行错误86%)...

解题思路:注意事项:参考代码:#include #include #define N 1000int main(){unsigned int n,k,T;int i,j;int num[N];int m1;int sum0;scanf("%d%d%d",&n,&k,&T);while(n<1||k<1||T<1||n>1000000||k>1000000||T>1000000){scanf("%…

方正高影仪安装方法_铝合金门窗是怎么安装的?

铝合金门窗安装主要材料有铝合金门窗型材、钢钉、膨胀螺栓、滑移合页、防水密封胶、压条等。铝合金门窗的规格、型材应符合设计要求&#xff0c;五金配件配套齐全、并具有出厂合格证。防腐材料、填缝材料、密封材料、防锈漆、水泥、砂、连接铁脚、连接板等应符合设计要求和有关…

怎样用c语言统计字符个数字,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#includemain(){int acount0,bcount0,ccount0,dcount0;char a;printf("请输入一行字符:\n");a getchar();while (a !\n){switch (a){caseq:casew:casee:caser:caset:casey:caseu:casei:caseo:casep:casea:cases:cased:c…

无法从“cstring”转换为“lpcstr”_U盘重装系统后,无法使用?

U盘重装系统&#xff0c;误GPT分区转换到mbr分区后&#xff0c;无法读取&#xff0c;储存&#xff0c;格式化失败&#xff0c;解决方法如下&#xff1a;无法读取无法格式化1.按住“WINR”&#xff0c;呼出“cmd”命令符WINR2.输入&#xff1a;diskpart&#xff0c;回车进入disk…

达内培训c语言,【达内C  培训教程】C语言实例 分数之和

求这样的四个自然数p,q,r,s(p<q<r<s)&#xff0c;使得以下等式成立&#xff1a;1/p 1/q 1/r 1/s1*问题分析与算法设计若规定p<q<r<s&#xff0c;将原式通分、化简并整理后得到&#xff1a;2<p<5p<q<7 q<p"">采用最简单的穷举方法…

dijkstra算法_最短路径问题——迪杰斯特拉算法(Dijkstra)

假期过长&#xff0c;导致停更了好长时间&#xff0c;复习一道算法题找找感觉。前段时间看到一篇文章&#xff0c;里面提到了统治世界的十大算法&#xff0c;其中之一就是迪杰斯特拉算法(Dijkstra)&#xff0c;该算法主要解决的”最短路径“这一类问题。说法虽然夸张了点&#…

c语言锐龙,AMD官方:锐龙5000抗热可以达到95°C 没问题!

对于现在的CPU而言&#xff0c;温度设定是一个至关重要的影响因素。在CPU制程工艺和架构设计水平差不多的情况下&#xff0c;谁的温度墙设定的更高&#xff0c;性能的发挥也会更好&#xff0c;因为如果一旦降频再强的性能也发挥不出来。而在这一点上&#xff0c;AMD锐龙5000系列…

ES6 深拷贝_你别自以为是:ES6误区 之 Object.assign()、const

文/北妈阅读本文需要 2.3分钟一很久没发技术文&#xff0c;今天北妈在新开一个技术系列&#xff1a;“别自以为是&#xff0c;1分钟走出JS常见误区“&#xff0c;里面我会每期挑选几个常见基础属性&#xff0c;讲一讲里面最容易被人忽略和认知错误的误区。帮助大家更好的掌握基…

c语言的数据类型复数型,C语言数据类型

一、基本类型C语言的基本数据类型包括字符型、整数型、浮点型。1、字符型(char)描述单个字符(一个字节)&#xff0c;用半角的单引号包含起来&#xff0c;如a、A、1、$等&#xff0c;键盘能输入的英文和半角的符号都是字符。A B C ...... Za b c ...... z0 1 2 ...... 9~ ! ...…

opengl实现三维动画简单代码_使用Python简单实现马赛克拼图!内附完整代码

今天小编带大家使用python简单实现马赛克拼图&#xff0c;内容比以往会稍长一些&#xff0c;各位看官老爷可以慢慢细读&#xff0c;若有不足之处还望请斧正&#xff0c;闲话不多说&#xff0c;请看文章。先看原图&#xff1a;效果图&#xff1a;思路&#xff1a;拼图的原理其实…

耳机不支持android,安卓手机为什么不能用EarPods耳机 原因分析【图解】

相信很多人都有这样的疑问&#xff0c;iPhone和安卓手机的耳机孔是一样的&#xff0c; 安卓手机为什么不能用EarPods耳机? 这是什么原因&#xff1f;本次在这里就给大家分析下。安卓手机为什么不能用EarPods耳机?目前市面上大多数的手机仍采用3.5mm的耳机接口。但很多人不知道…

python自然语言处理库_Python 自然语言处理(NLP)工具库汇总

最近正在用nltk 对中文网络商品评论进行褒贬情感分类&#xff0c;计算评论的信息熵&#xff08;entropy&#xff09;、互信息&#xff08;point mutual information&#xff09;和困惑值&#xff08;perplexity&#xff09;等&#xff08;不过这些概念我其实也还理解不深...只是…

android代码清除锁屏密码,清除Android手机锁屏密码的三个小妙招

大家有没有把锁屏密码忘记过&#xff1f;发生这种情况的概率应该很小吧&#xff0c;但为了以防万一大家还是看一下本文的解锁教程吧&#xff01;这种解锁的方法要求&#xff0c;被锁上的手机是联网的状态&#xff0c;并登录了google账号&#xff0c;账号密码已知。如果以上条件…

android退出app代码,Android应用退出代码各种方式

1. 点击按钮最小化app返回到home//并不会退出app&#xff0c;只是最小化findViewById(R.id.button3).setOnClickListener(new OnClickListener(){public void onClick(View v){Intent intent new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);startA…