服务器设计和开发的体会

做服务器有一段时间了,想记录下自己的体会。

依我的看法,服务器可以看做是4个部分组合起来的, 底层的网络框架, 通用的数据结构和库, 整个服务器的架构设计,服务器的上层业务逻辑。
 
底层的网络框架,目前可以说技术基本都是公开的了, 可以自己从头写,采用iocp,epoll。也可以直接使用ace, libevent 或者asio,

如果是linux下,我觉得libevent是个非常好的选择,效率足够,而且可移植。代码也简单。ace的缺点,就是比较大,用他来开发,没有什么问题,遇到问题需要查找维护,就比较棘手了,asio看过一点,proactor模式的。口碑也不错。

如果直接用这些库来支撑上层逻辑,那么上层的开发还是比较麻烦的,自己还需要在这些库的基础上,再加上一些封装,以简化上层的开发难度。
譬如lau stephen老兄的spserver, 就是个不错的尝试。他是在libevent的基础上,整合出一个应用层框架。

网络框架的两个关键点,1是性能要足够,2是要方便上层开发。3是要稳定,有这3点,就足够了。
 
通用的数据结构和库,主要是用来实现一些封装,譬如封装线程,封装数据库访问,封装线程池,封装内存池, 封装线程安全的队列,该队列主要用来实现半同步,半异步模式中关键的排队层。 这个库,应该是随着自己的经验和水平的增进而不断改进的。对于大部分服务器的开发,这个库都是必要的.
 
整个服务器的架构设计,设计架构的时候,考虑无非是简单,容易扩展,安全性,成本也是一部分考虑。 没有通用的架构,只有针对自己的需求和条件的比较好的架构。所以千万不能照抄架构,要结合自己的实际情况来思考,别人的东西,只能参考。简单的出发点,就是便于维护,KISS原则。

扩展性的关键,就在一个负载均衡,要保证系统中没有会阻碍性能提升的障碍点。安全性的考虑,很多关键的业务,必须部署在内网,以避免攻击。

例如,网游中常用的gate架构,既有安全性的考虑,也有负载均衡的考虑,他只把gate服务器部署在公网上。
 
服务器的上层业务逻辑, 这块千差万别,但是有一些共同的问题。譬如逻辑采用单线程还是多线程的问题,如果上层业务很简单,譬如就是简单的数据库查询或者注册认证,可以采用多线程来做逻辑,尽可能的提高服务器的性能。但是如果是很复杂的业务,譬如im或者网游逻辑服务器,数据交互会非常多,这个时候,多线程是很不可取的,维护,扩展性,都会出现很大的问题。查错也会成为大麻烦。

最好的线程划分还是按照业务的相关性,把业务纠缠比较紧密的,放在一个线程里。各个线程直接,通过消息或者队列来进行通信。

逻辑服务器的高下,主要在于细节。譬如数据结构的效率,内存分配的效率,服务器的防御性编程处理, 对于客户端的协议支持是否全面。 做逻辑服务器的关键,是要用心。只要是花心思了,保证稳定,能够满足客户端的业务需求和性能需求,就是很好了。


你可能感兴趣的:(多线程,数据结构,框架,负载均衡,服务器,架构设计)