摘要:网络服务器编程是一个巨大的挑战,这个挑战来自服务器需要完成的任务太多,这个挑战来自可能存在的恶意或无意破坏,这个挑战来自大量的与内核的交互,同时这个挑战也来自网络本身的极端不稳定性。在面对这些挑战时,服务器却被要求为快速、稳定、可用的结合物!本文关注这些挑战,并讨论如何避免其中遇到的一些问题。
让我们逐一来讨论上面说到的问题,首先说说服务器要完成的任务太多。现在的服务器大多非常繁忙,比如每秒都可以需要处理上千上万个客户请求,这对于稍等大一点网站或者游戏服务器来说都是经常的事。此时我们有两个思路来解决这个问题,一个思路是提高硬件的速度,另一个思路就是提高软件的性能,通常情况是两路齐走。本文不说硬件,所以只是软件这条思路如何走。
为了提高软件性能当然是算法,此时我必须使用并行的算法来处理,并行是当前提高恨不能的必要方法,也是基本方法。在一台主机上的并行是通过软件来实现的,此时有进程模式和线程模式,由于现代的操作系统已经很强大了,所以我们还可以依赖操作系统提供的IO复用、异步IO等等功能实现隐匿的并行。当然后者简单易于实现,但性能的提升空间却没有手工并行再加上此类技术大,所以人们都会手工实现线程或进程,然后在线程或进程内部再使用IO复用、异步IO等技术,所谓为性能无所不用其极。
服务器编程的另一个挑战是需要识别有意无意的破坏,或把有意无意的破坏限制在最小的范围内,单一客户的请求应该是独立与其他用户的请求的,此时一个用户的失败不至于影响其他用户,从而把这种失败破坏限制在有限的范围内。服务器最常见的破坏就是拒绝服务器攻击,如果没有此种特性的服务器,面对拒绝服务攻击只能听之任之了。有时服务器可能需要维护一个统计信息,这样可以比较容易识别出有意破坏,但这一思路可以提高服务器的可用性的同时却降低了服务器的速度。对,服务器的三个特性有时是相互矛盾的,我们提高了其中一个,相应的另一个却在下降,此时需要一种权衡,或更复杂的决择机制。分层或分级是此时我没用的策略,在不同的级别上采用不同的决择。并行在此时仍然是基本的思路与措施。