a. 当服务器内部需要发送的数据激增的时候,通过压入发送队列,能够减轻IO的处理压力。很多时候我们会发现整个服务器的性能瓶颈就在IO的处理上(收发) ,而不是服务器的数据库操作等。因此设计上就要以减轻IO处理为目标。
b. 使用发送队列,能够把多个回复数据包合并一次发送,极大减轻了IO的压力。
发送队列的结构也就是一个Queue,大致的设计如下:
代码 public class SendMessageQueueController
{
Queue queue;
}
public class SocketConnection
{
private SocketReceiveQueue receiveQueue;//接收队列
private SocketSendQueue sendQueue;//发送队列
}
public class SocketSendQueue
{
private Queue queue;//发送协议集合
}
代码逻辑如下:
a. 把需要发送的协议包压入当前SocketSendQueue.
b. 判断SocketConnection是否已经存在在SendMessageQueueController,如果不存在,则入列;如果存在,则返回。
c. SendMessageQueueController每隔x毫秒检查一次发送队列,如果发现有数据,则进入while循环,直到所有SocketConnection出列并发送所有的数据。之后再进入等待。
d. 所谓包合并发送,就是把多个协议包一次写入发送的Stream里面,然后让socket发送。