请教一个ACE Proactor服务器(IOCP)的架构设计问题
工作中需要做一个服务器,要处理成千上万的连接,决定采用ACE的Proactor模型(即Windows下的IOCP)
服务器的业务是接受客户端的连接,简单交互后,收到一个数据包,对该数据包进行一些处理后,返回给客户端,断开。
数据包的处理可能会比较耗时,包括加解密运算,可能还要查询数据库等
用ACE Proactor时,现在有两种选择(方案):
第一种:从ACE_Service_Handler派生一个类,在这个类中进行网络收发,并进行运算处理(在handle_read_stream中收到后处理)。也就是说所有的工作都在一个线程中完成,整个服务器基本只有这一个线程。
第二种:从ACE_Service_Handler派生的类中只做网络收发,把收到的数据包放入一个队列,让另一个线程去循环处理,处理后的结果再通过网络发出去。也就是说基本是两个线程,再加一个队列。
第一种做法因为是单线程,基本不需要考虑任何线程同步的问题,实现会比较简单。
第二种做法可能结构会比较好,但实现上麻烦一些,需要考虑两个线程间的同步,并要在队列的数据包中保存一个连接句柄,用于处理完后的发送,还要考虑数据包处理完后它的所属连接可能已经关闭的问题。
我个人认为ACE的Proactor(即IOCP)本身是异步IO模型,它设计的目的就是为了减少多线程所带来的复杂性,避免CPU线程同步而造成的性能退化。个人认为两个线程一个队列的方法,对于效率的提高没有帮助。
因此我比较倾向于第一种方案,而有同事则认为应该用第二种方案。
请有相关ACE服务器设计经验的朋友谈谈看法,谢谢。