wiki对Server的定义:java
In computing, a server is a computer program or a device that provides functionality for other programs or devices, called "clients". This architecture is called the client–server model, and a single overall computation is distributed across multiple processes or devices.python
分类:Typical servers are web
Web Server,典型例子是淘宝。
特色:数据库
Game Server,典型例子是魔兽世界。
特色:json
Application Server,典型例子是QQ。
特色:后端
服务端在client-server模型中的扮演角色:缓存
服务端,在物理上表现为一或多台主机,在逻辑上向客户端暴露一组host:port二元组,接受客户端链接,为每一个客户端链接维持链接会话(Session)。客户端与服务端借助链接会话传递消息,消息按必定的协议序列化与反序列化,客户端与服务端的逻辑模块由消息的内容驱动运转。
不管是Web Server,仍是Game Server,在运做流程上都大致相同。而在流程中的细节上,有共同点,也有不一样点。下面就分开说道说道。ruby
共同点:服务器
都是为客户端提供多种服务网络
好比淘宝既提供搜索服务,又提供商品页查询服务。
魔兽世界既提供登陆服务,又提供让你在场景里战斗、走跑跳的服务。
都须要链接会话概念
会话是创建在链接之上的概念,其实本质上是服务端为某个特定客户端维持的数据结构与状态信息。
Game Server自没必要说,玩家登陆以后,服务端须要有一个专门的全局服务器维护玩家状态与玩家的部分较热的存档信息,玩家进入到某个场景,场景服务器还须要专门维护一份玩家的场景相关的状态信息。
Web Server,链接会话一样存在,最直观的理解是淘宝登陆以后服务端会为客户端保持一个会话上下文。
服务端的每台物理机服务多个客户端
都具备分布式结构
架构的演化老是类似的,Web服务端与游戏服务端在发展过程当中相互学习相互演进,目前造成的主流架构基本都至少应该将专门管链接的、专门管逻辑、专门管存储的作必定程度的物理隔绝。
能够像skynet同样,利用luaState作隔绝;能够像Erlang同样,利用actor作隔绝;也能够最简单的,按进程隔绝。只要能保证其中之一挂掉不会产生连锁反应致使其余都挂掉就能够了。
开发语言
实际上也是近几年手游开发火起来以后开发语言才趋于统一的。web开发一直是百家争鸣,而游戏开发在之前是C++一家独大。
可是如今,客户端的逻辑层已经基本见不到C++的影子了,服务端纯用C++的也愈来愈少了。lua、python、java、C#、Erlang、js甚至ruby的工业级游戏服务端框架都有出现,web服务端和游戏服务端的开发语言已经趋同。
不一样点:
会话的存在形式(本质区别)
这一点是web服务端与游戏服务端最本质的区别
web服务端的客户端与客户端之间交互很是有限,所以,服务端能够将会话状态保存在外部存储服务,好比一些缓存中间件、文件系统中间件,而后等再用到的时候再拿出来就能够了。
而游戏服务端的客户端与客户端之间交互很是频繁,好比,同场景的其余玩家会不停作不规律移动,战斗时一个技能就会对复数个玩家形成影响。
这时若是将会话状态保存在外部,会形成频繁的状态存取,严重影响服务器吞吐量。所以对于游戏服务端来讲,会话一般保存在进程内。
交互频率与数据流向
Web Server的频率低,并且数据的流动是由客户端驱动的,流向一般是客户端请求了,服务端才返回。
Game Server的频率高,数据的流动一部分由客户端驱动,一部分由服务端驱动。流向除了服务端对客户端请求的响应,还有服务端的主动推送。
通讯协议基础
通讯协议基础就是客户端和服务端通讯的协议所依赖的协议基础。
按常识理解的话,web通讯的基础在应用层是http协议。因为小说君对web开发并不太熟悉,因此不太清楚目前私有协议在web开发中的应用,可是想必即便是私有协议,也必定是套在http协议的某些字段里面的,这跟游戏的客户端服务端通讯有本质区别。
游戏一般会实现私有的序列化协议,能够简单理解为应用层定义协议包结构平铺成字节流或者是串行序列化字节流。若是要支持必定程度的协议版本兼容,会用二进制json或者protobuf来实现协议序列化,可是通讯协议自己是没有「基础」可言的,纯私有化协议,不具普适性,也没有必要定义成一种专门的协议。
对第三方组件的依赖程度
web服务端发展速度快,从业者多,同技术栈的从业者交流更深刻更频繁。所以,web服务端出现、而且还会出现愈来愈多的第三方独立组件。web服务端的从业者甚至只须要在本身的技术栈不一样层次上选择不一样的第三方组件,黏合起来,就能造成一整套的解决方案,很是方便。
游戏服务端正相反,比较封闭,基本上每一个项目组要么是从头至尾重写,要么是从其余项目组拿来整套技术栈直接改改。基本不存在第三方独立组件的状况,在技术开放氛围好些的公司还好,毕竟你们能够复用同一套框架,不然的话,公司内的框架多种多样,各类造轮子出来的,各类空降团队从原来公司带过来的,技术没法复用,团队成员流动更是一大难题。
在游戏服务器端,每每须要处理大量的各类各样的任务,每一项任务所需的系统资源也可能不一样。而这些复杂的任务只用一个单独的服务器进程是很难支撑和管理起来的。因此,游戏服务器端的开发者每每须要花费大量的时间精力在诸如服务器类型的划分,进程数量的分配,以及这些进程的维护,进程间的通信,请求的路由等等这些底层的问题上。而Firefly彻底能够完成这些重复而繁琐的工做,从而将上层的游戏开发者解放出来,把精力更多的放在游戏逻辑的实现上面。
Firefly是免费、开源、稳定、快速扩展、能“热更新”的分布式游戏服务器端框架,采用Python编写,基于Twisted框架开发。
一个最基本的服务器就是一个在不停运行着的应用程序。
在分布式游戏服务器中,咱们须要的服务器具备的功能有:
Net connect 作客户端链接
Root监听其余服务进程消息
Node链接其余服务进程,db数据库,cache缓存
是否须要监听客户端链接,是否监听其余服务进程消息等这是都是能够在config.json中进行配置。包括各个服务器的名称以及各个服务器之间的链接关系。这样就能够自定义出本身的分布式架构。
从功能职责上来看,Firefly框架结构以下图所示:
Client端(各待预警的子项目)数据上报(只需1步):
Server端(分析预警系统):
异常错误类:上报过来的信息通常为须要进行预警通知,错误的验证逻辑由上报者本身内部判断;
信息记录类:上报者只是上报原始记录信息,具体是否触发预警的逻辑验证由预警后台程序验证;
周期性任务:
该部分主要指预警后台周期性(天/小时/分钟)执行各类统计分析任务,对可能出现异常的分析结果进行预警;某种程度上能够很好的起到数据埋点实时预警的第二道保障做用;
预警系统主体表结构设计: