高性能服务器设计总结(2)
服务器和客户的通讯,存在两种基本的情况,
1. 客户到服务器。
2. 服务器到客户。
基于消息的通讯系统,特别是在HTTP之上实现的诸如soap,xmlrpc,xmlpp等,这些都是短连接,易于构建从客户到服务器的通讯,但服务器要主动向客户发数据就没那么容易,原因是客户可能在子网或是子网的子网中。
基于短连接的通讯也可变相的实现服务器向客户发送数据,这要求客户要主动到服务器上去检索有没有发向自己的数据,若有需要主动的取数据。在实时性要求较高的系统中这是无法满足要求的。
更有效的实现方案是服务端保留客户的连接,使用长连接,原则上仅有客户可关闭这个连接。这样服务器就能通过这个连接主动的向客户发送数据了。但在单位时间内的接入量就没有短连接那样多了。
保留了客户的连接就能解决问题了吗?没有这么简单,这在客户和服务直接连接的系统中易于实现,但在复杂系统中难度就高了。
通常,客户连接进来的套接字都存在接入服务器上,而接入服务器使用少量的线程,每个线程使用一个套接字与应用服务器交互,客户的每个请求必须有至少一个回应,这样接入服务器转发一个请求,然后再回收一个或多个数据转发给客户。
这一点容易实现,试想一种场景,当应用服务器处理完了发来的请求,需要向当前客户发送一个回应,同时还要向其他客户发送数据。这怎么办呢?这是一种典型的应用,多人会话和视频会议就有这样的特点,网络游戏更是篇布这样的特点。
解决这个问题的方法很多,目前我还没有见到让我十分钟情的方案,我的实现如下:
另建一条有应用服务器到接入服务器的连接,服务端在接入服务器上,应用服务器要告诉接入服务器,要向那些客户转发数据转发的数据是什么。
但现在问题又来了,当有多个接入服务器怎么办?这就意味着要转发的客户可能分布在不同的接入服务器上。这时结构应做一下调整。
接入服务器将客户在那个服务器的消息注册在转发服务器上,转发服务器根据这些信息转发数据。