服务端架构中的“网关服务器”

这么一个场景:一个要承载高并发、具有高性能的后台服务,往往会有多个不同的应用服务。问题来了,你会怎样设计架构呢?

如下图所示,为了共用一个稳定高效的网络处理功能,把所有服务写在一个进程里。

wKioL1MgTQajZTkoAABdKDgaHU4008.jpg

接下来悲剧一幕幕就要上演了,如果各个模块是多人协作开发,网络库的作者得想办法设计个插件机制供各个应用挂载,开发时无论是人员或者代码都耦合非常严重,大大影响协作、开发效率,后期要增减一个应用也得大动手脚。好吧,这还可以忍受,问题是写应用的人技术水准还可能层次不齐,一个短板就可能造成整个服务崩溃。

彼此的依赖太严重,效率低下,责任推诿让各个协作者们苦不堪言,各个应用服务的作者决定在自己的服务里单独提供网络模块。就有了如下图的情况,每个应用服务的提供者自己还要提供网络功能模块

wKiom1MgTW-ShjenAACL5pf0yxI272.jpg

接下来悲剧又一幕幕上演了,要知道高性能网络服务模块需要的技术含量之高不是人人都可以写好的,即使咱都能写好或者统一使用了一个牛X的网络库,你对客户端暴露那么多服务地址不讨人嫌嘛,甚至在我身边还有采用专门写一个集中服务来供客户端获取各应用服务的地址的设计......。

通过对上面两种设计的批判,大家是不是会想,这架构缺陷很明显,肯定采用的人很少吧,但是说实在的我已经遇到多次这种设计了,也许是观点不同吧,我对以上两种设计在上述场景下持否定态度。

那我们应该采用怎样的设计适应这种场景呢?

如下图,这是腾讯和微信的部分后台设计架构图

wKioL1MgTbuxOT-sAADnpKMtLJw715.jpg

wKiom1MgTeOibfoUAAFbdUOTQus251.jpg

可以看到都会有个接入服务,然后把不同的请求分发给不同的应用服务。其实这个接入服务就是“网关服务”,这种设计在nginx的负载均衡和反向代理功能中都有体现,另外在网游服务器中也大量采用了这种设计思路,由网关服务器将不同的请求分发到不同的应用服务上,等应用服务器处理完后再通过网关服务器转发给客户。

那这种设计的优点在哪呢

借用知乎王明雨知友的一个比喻:

把服务器想象成饭店,没有网关服务器的情况,就如同每一个厨师服务一桌顾客,从点菜开始到炒菜到上菜到收银,有n个厨师就只能服务n桌顾客。有了网关服务器的话,网关服务器就成了强大的服务员,把招呼,点菜、上菜和收银的活都做了,厨师只需要专心炒菜就行。这样饭店的效率就大大提高了。

  1. 这样可以把要承载高并发,高性能任务的网络服务独立出来专门做好,做强(对于http协议的场景,可以直接用nginx做网关服务器)。这样各个应用只需把重点放在对业务逻辑的处理即可。从技术架构和项目协作上都做到了解耦。

  2. 增强了系统的健壮性,一个应用出现故障并不会对其他应用产生影响。后期运维也好做灰度更迭。

  3. 有应用集群的情况下,可以通过网关服务器做负载均衡,把请求分发在负载低的服务器上。


再引用一个游戏公司对网关服务器的评价:

服务器架构

采用带网关的服务器架构,将客户端与游戏服务器隔离,相比传统的客户端-服务端直连的架构有如下优势:

1作为网络通信的中转站,负责维护将内网和外网隔离开,使外部无法直接访问内部服务器,保障内网服务器的安全,一定程度上减少外挂的***。

2网关服务器负责解析数据包、加解密、超时处理和一定逻辑处理,这样可以提前过滤掉错误包和非法数据包。

3客户端程序只需建立与网关服务器的连接即可进入游戏,无需与其它游戏服务器同时建立多条连接,节省了客户端和服务器程序的网络资源开销。


服务端高度模块化

大厅服务端将登录、用户信息、房间信息、日常任务、道具、银行、比赛、排行、活动、网站等11个功能拆分成11个独立的服务端子模块,模块之间不会相互影响,即使某模块出错也不会影响全局,提高了服务端的稳定性;与子模块平行的新功能可以自由新增挂载,扩展性强。


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

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

相关文章

一起来庆祝 .NET 20 周年!

你知道吗?.NET 将要迎来 20 周年, 在 20 年前的 2002 年, 微软公布了下一代的软件、服务的愿景和路线,2 月 13 日,Visual Studio .NET 推出,.NET 开发平台的第一个版本正式向世界发布。而现在, .NET 6 成为统一的开发平台&#xf…

不固定图片宽高瀑布流_APP设计学习:瀑布流式的产品UI设计

看到好的APP产品UI设计,真是忍不住想要停留几秒,慢慢来欣赏。今天学堂君收集了近期不错的优质的APP设计作品,看起来极舒服的UI界面,分享给大家。这一期的重点学习:在APP界面设计当中,如何应用瀑布流式的布局…

【Blog.Core开源】网关自定义认证鉴权与传参

书接上文,上回咱们说到了《【Blog.Core开源】网关统一集成下游服务文档》,已经将多个下游服务统一集成到了网关里,并且也把接口文档Swagger给集成了,那今天就说一下认证和鉴权相关的话题。继续说下故事背景在平时开发的时候&#…

HDFS HA与QJM(Quorum Journal Manager)介绍及官网内容整理

问题导读1.HDFS HA与QJM解决了什么问题? 2.HDFS HA与QJM区别是什么? 3.在HA(两个namenode)架构下,如何访问hdfs文件?【使用QJM构建HDFS HA架构(2.2)】本文主要介绍HDFS HA特性,以及如何使用QJM(…

#时间预测算法_【时间序列】时序预测竞赛之异常检测算法综述

本文将介绍在时间序列预测相关问题中常见的异常检测算法,可以很大程度上帮助改善最终预测效果。异常分类时间序列的异常检测问题通常表示为相对于某些标准信号或常见信号的离群点。虽然有很多的异常类型,但是我们只关注业务角度中最重要的类型&#xff0…

监测利器cacti服务安装

1、Cacti原理及概述1Cacti是一款使用PHP语言开发的性能与流量监测工具。监测的对象可以是linux也可以是windows也可以是路由器交换机等网络设备主要基于SNMPsimple network managerprotocol简单网络管理协议来搜集cpu占用内存使用运行进程数磁盘空间网卡流量等各种网络数据。2实…

C#中的类型转换

前几篇文章中经常说到强制类型转换,就是可以将派生类对象强制转换为基类对象的做法或者通过as运算符进行的转换。今天我们就来一起简单了解复习下在C#中都有哪些类型的转换。要理解转换很容易,日常的开发编码过程中,由于变量类型的不同我们可…

linux之快速过滤文本的关键字以及快速过滤目录下的关键字

1、快速过过滤文本的关键字 cat file | grep 关键字 比如Android日志文件很长,需要过滤Exception,就可以用这个办法,如下图 2、快速过滤目录下的关键字 grep -r 关键字 比如我们在linux上看目录下哪些关键字段,好像开发工具里面的 find usag…

hadoop使用

2019独角兽企业重金招聘Python工程师标准>>> 框架简介 Hadoop使用主/从(Master/Slave)架构,主要角色有NameNode,DataNode,secondary NameNode,JobTracker,TaskTracker组成。 其中Nam…

bigint hive java类型_详解Apache Hudi如何配置各种类型分区

1. 引入Apache Hudi支持多种分区方式数据集,如多级分区、单分区、时间日期分区、无分区数据集等,用户可根据实际需求选择合适的分区方式,下面来详细了解Hudi如何配置何种类型分区。2. 分区处理为说明Hudi对不同分区类型的处理,假定…

C#中的命名空间和程序集

前言今天这篇文章和大家一起学习下C#语言下的命名空间和程序集。在日常的编码工作中,我们对命名空间和程序集都不会很陌生。在创建项目文件时,IDE自动会为我们创建好一个大的命名空间和程序集。大多数业务代码都是在解决方案下各自的命令空间里进行编码的…

基于jQuery的ajax系列之用FormData实现页面无刷新上传

接着上一篇ajax系列之用jQuery的ajax方法向服务器发出get和post请求写,这篇主要写如何利用ajax和FormData实现页面无刷新的文件上传效果,主要用到了jQuery的ajax()方法和XMLHttpRequest Level 2的FormData接口。关于FormData,大家可以看MDN文…

abd shell关闭所有程序_在后台服务器上运行程序

之前总结过screen的用法,但还可以用nohup命令。nohup工具:Linux系统中有提供一个很好的不挂断地运行命令——nohup。我们使用nohup能很简单的控制使用,在此就简单的介绍一下nohup工具。nohup 命令nohup就是不挂起的意思( no hang up)。用途&a…

解锁JDK 12的奇妙之旅:新特性详解

欢迎来到我的博客,代码的世界里,每一行都是一个故事 解锁JDK 12的奇妙之旅:新特性详解 前言switch表达式拓展NumberFormat对复杂数字的格式化字符串支持transform、indent操作新增方法Files.mismatch(Path, Path)Teeing Collector支持unicode…

.NET6之MiniAPI(十四):跨域CORS(上)

为了说明跨请求,创建了两个项目,一个mini api,端口是5001,另一个razor page项目,端口是5280。5280项目会在页面用ajax的方式来请求5001,形成跨域请求,由于是本地测试,host都是localh…

django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct

2019独角兽企业重金招聘Python工程师标准>>> 1.多表连接查询:当我知道这点的时候顿时觉得django太NX了。 class A(models.Model): name models.CharField(u名称) class B(models.Model): aa models.ForeignKey(A)B.objects.filter(aa__name__c…

利用tabluea分析数据的案例_利用德温特分析Dartsip的案例检索结果

德温特创新平台(Derwent Innovation)与Darts-ip知识产权案例数据库均是科睿唯安旗下的知识产权数据库,虽然这两个数据库的侧重点分别在于专利信息与知识产权判例,但若将两者结合使用则能发挥11>2的作用,打通专利全生命周期。关注我们的朋友…

linux网络编程之怎么配置好unp.h文件

1、获取unp源码 下载地址:http://www.unpbook.com/src.html 然后用tar -zxvf unpv13e.tar.gz命令解压 2、进入unpv13e目录执行configure cd unpv13e ,然后执configure文件 3、打开README文件,使用make命令 打开README文件

客户端禁用Keep-Alive, 服务端开启Keep-Alive,会怎么样?

最近部署的web程序,服务器上出现不少time_wait的tcp连接状态,占用了tcp端口,花费几天时间排查。之前我有结论:HTTP keep-alive 是在应用层对TCP连接的滑动续约复用,如果客户端、服务器稳定续约,就成了名副其…

linux网络编程之一般应用采用的协议和不同套接字的地址结构以及用户进程和内核通过哪些函数传递套接字的地址结构

1、一般应用采用的协议 2、不同套接字的地址结构 3、用户进程和内核通过哪些函数传递套接字的地址结构 从进程到内核传递套接字的地址结构函数有3个 bind、connect、sendto函数 从内核到进程传递套接字的地址结构函数有4个函数 accept、recvfrom 、getsockname 、getpeername…