近期由于工作的需要,一直在重构服务器,其中,做得最多的,就是把服务器的架构模式从同步改为异步模式。
先简单的介绍下同步和异步两个概念:
同步模式:服务器在发送请求时,阻塞等待请求的响应;
优点:实现简单,同步接收数据,方便做各种统计和服务器的切换。缺点:服务不平稳,容易受到冲击,造成雪崩;
异步模式:服务器发送请求后,马上处理别的消息;
优点:服务吞吐量大,不容易受到冲击,可以采用并发策略,提高响应时间;缺点:实现困难,需要各种中间状态的存储。如果遇到多个服务交互的情况,代码量增长较大。
同步切换为异步,需要考虑:
1. 中间数据的存储;
同步模式,由于进程模块阻塞,等数据包回来,上下文信息依然存在,可以进行相应的处理;异步模式,由于数据发送后,进程去处理别的信息,所以,该连接的上下文信息,必须存储下来。等对应的服务返回,再重新提取。
2. 热备方式的改变;
服务的热备,同步模式,要判断机器是否死机,相对比较简单。比如,连续超时n次,则对服务器进行切换。异步模式,处理相对复杂。我的实现方式,是根据收发包的时间,进行对应的判断。
3. 代码管理方式(不属于功能,但是个人感觉蛮重要的);
同步,对个服务的交互,有时一个接口就可以实现;异步模式,涉及多个交互的切换,如果不整理好代码的流转,有时会影响到开发的效率,还有后续代码的维护。状态机对于梳理异步模式的代码,还是蛮有作用的。一个功能,定义好各个流程的状态,然后在每个状态开发对应的功能,虽然代码的量会增大,但是可维护性也响应提高很多。
总之,同步模式和异步模式,有各自的优缺点。没有绝对的好处,只有适应产品的特点的,才是好的技术。