服务器设计和开发的体会
2011-09-06 10:44
169 查看
做服务器有一段时间了,想记录下自己的体会。
依我的看法,服务器可以看做是4个部分组合起来的, 底层的网络框架, 通用的数据结构和库, 整个服务器的架构设计,服务器的上层业务逻辑。
底层的网络框架,目前可以说技术基本都是公开的了, 可以自己从头写,采用iocp,epoll。也可以直接使用ace, libevent 或者asio,
如果是linux下,我觉得libevent是个非常好的选择,效率足够,而且可移植。代码也简单。ace的缺点,就是比较大,用他来开发,没有什么问题,遇到问题需要查找维护,就比较棘手了,asio看过一点,proactor模式的。口碑也不错。
如果直接用这些库来支撑上层逻辑,那么上层的开发还是比较麻烦的,自己还需要在这些库的基础上,再加上一些封装,以简化上层的开发难度。
譬如lau stephen老兄的spserver, 就是个不错的尝试。他是在libevent的基础上,整合出一个应用层框架。
网络框架的两个关键点,1是性能要足够,2是要方便上层开发。3是要稳定,有这3点,就足够了。
通用的数据结构和库,主要是用来实现一些封装,譬如封装线程,封装数据库访问,封装线程池,封装内存池, 封装线程安全的队列,该队列主要用来实现半同步,半异步模式中关键的排队层。 这个库,应该是随着自己的经验和水平的增进而不断改进的。对于大部分服务器的开发,这个库都是必要的.
整个服务器的架构设计,设计架构的时候,考虑无非是简单,容易扩展,安全性,成本也是一部分考虑。 没有通用的架构,只有针对自己的需求和条件的比较好的架构。所以千万不能照抄架构,要结合自己的实际情况来思考,别人的东西,只能参考。简单的出发点,就是便于维护,KISS原则。
扩展性的关键,就在一个负载均衡,要保证系统中没有会阻碍性能提升的障碍点。安全性的考虑,很多关键的业务,必须部署在内网,以避免攻击。
例如,网游中常用的gate架构,既有安全性的考虑,也有负载均衡的考虑,他只把gate服务器部署在公网上。
服务器的上层业务逻辑, 这块千差万别,但是有一些共同的问题。譬如逻辑采用单线程还是多线程的问题,如果上层业务很简单,譬如就是简单的数据库查询或者注册认证,可以采用多线程来做逻辑,尽可能的提高服务器的性能。但是如果是很复杂的业务,譬如im或者网游逻辑服务器,数据交互会非常多,这个时候,多线程是很不可取的,维护,扩展性,都会出现很大的问题。查错也会成为大麻烦。
最好的线程划分还是按照业务的相关性,把业务纠缠比较紧密的,放在一个线程里。各个线程直接,通过消息或者队列来进行通信。
逻辑服务器的高下,主要在于细节。譬如数据结构的效率,内存分配的效率,服务器的防御性编程处理, 对于客户端的协议支持是否全面。 做逻辑服务器的关键,是要用心。只要是花心思了,保证稳定,能够满足客户端的业务需求和性能需求,就是很好了。
依我的看法,服务器可以看做是4个部分组合起来的, 底层的网络框架, 通用的数据结构和库, 整个服务器的架构设计,服务器的上层业务逻辑。
底层的网络框架,目前可以说技术基本都是公开的了, 可以自己从头写,采用iocp,epoll。也可以直接使用ace, libevent 或者asio,
如果是linux下,我觉得libevent是个非常好的选择,效率足够,而且可移植。代码也简单。ace的缺点,就是比较大,用他来开发,没有什么问题,遇到问题需要查找维护,就比较棘手了,asio看过一点,proactor模式的。口碑也不错。
如果直接用这些库来支撑上层逻辑,那么上层的开发还是比较麻烦的,自己还需要在这些库的基础上,再加上一些封装,以简化上层的开发难度。
譬如lau stephen老兄的spserver, 就是个不错的尝试。他是在libevent的基础上,整合出一个应用层框架。
网络框架的两个关键点,1是性能要足够,2是要方便上层开发。3是要稳定,有这3点,就足够了。
通用的数据结构和库,主要是用来实现一些封装,譬如封装线程,封装数据库访问,封装线程池,封装内存池, 封装线程安全的队列,该队列主要用来实现半同步,半异步模式中关键的排队层。 这个库,应该是随着自己的经验和水平的增进而不断改进的。对于大部分服务器的开发,这个库都是必要的.
整个服务器的架构设计,设计架构的时候,考虑无非是简单,容易扩展,安全性,成本也是一部分考虑。 没有通用的架构,只有针对自己的需求和条件的比较好的架构。所以千万不能照抄架构,要结合自己的实际情况来思考,别人的东西,只能参考。简单的出发点,就是便于维护,KISS原则。
扩展性的关键,就在一个负载均衡,要保证系统中没有会阻碍性能提升的障碍点。安全性的考虑,很多关键的业务,必须部署在内网,以避免攻击。
例如,网游中常用的gate架构,既有安全性的考虑,也有负载均衡的考虑,他只把gate服务器部署在公网上。
服务器的上层业务逻辑, 这块千差万别,但是有一些共同的问题。譬如逻辑采用单线程还是多线程的问题,如果上层业务很简单,譬如就是简单的数据库查询或者注册认证,可以采用多线程来做逻辑,尽可能的提高服务器的性能。但是如果是很复杂的业务,譬如im或者网游逻辑服务器,数据交互会非常多,这个时候,多线程是很不可取的,维护,扩展性,都会出现很大的问题。查错也会成为大麻烦。
最好的线程划分还是按照业务的相关性,把业务纠缠比较紧密的,放在一个线程里。各个线程直接,通过消息或者队列来进行通信。
逻辑服务器的高下,主要在于细节。譬如数据结构的效率,内存分配的效率,服务器的防御性编程处理, 对于客户端的协议支持是否全面。 做逻辑服务器的关键,是要用心。只要是花心思了,保证稳定,能够满足客户端的业务需求和性能需求,就是很好了。
相关文章推荐
- 服务器设计,开发的体会
- 升讯威微信营销系统开发实践:(3)中控服务器的设计
- 记录一个关于互联网、网页设计、Web开发、服务器运维优化、项目管理、网站运营、网站安全的网站
- SLG手游Java服务器的设计与开发——数据管理
- 设计与开发应用服务器(一)------常见模式
- MMORPG大型游戏设计与开发(服务器 AI 逻辑设定和状态结点)
- Go游戏服务器开发的一些思考(三十):排行榜服务器设计思路
- Go游戏服务器开发的一些思考(三十一):排行榜服务器设计思路(二)
- Unity3D游戏开发之网络游戏服务器架构设计培训
- 行业门户网站搜索引擎的一些设计开发体会
- SharpStreaming项目开发纪实:构建基本的服务器及客户端应用(五)——总体结构设计(客户端)
- PHP服务器文件管理器开发小结(二):版面设计和css
- 设计与开发应用服务器(一)------常见模式
- 基于Boost.Asio的异步通信服务器设计与开发
- MMORPG大型游戏设计与开发(服务器 AI 概述)
- SLG手游Java服务器的设计与开发——架构分析
- Microsoft SQL 服务器的最佳实践,设计和开发准则
- SLG手游Java服务器的设计与开发——网络通信
- MMORPG大型游戏设计与开发(服务器 游戏场景 地图和区域)
- 机动车驾驶员计时培训系统符合性检测平台TCP服务器设计和开发