3

我有一个服务器,boost::asio我希望使用它来制作多线程。

服务器可以分为几个“区域”,套接字从连接区域开始,然后一旦连接到客户端,就被移动到身份验证区域(即登录或注册),然后在服务器的各个其他部分之间移动,具体取决于关于客户在做什么。

我并不是特别想为所有套接字只使用一个线程池io_service,因为需要大量的锁,尤其是在与公共资源有大量交互的区域。但是,相反,我想为每个服务器组件(比如身份验证)提供自己的线程。

但是我不确定如何做到这一点。我考虑过为每个组件提供自己的 io_service 的想法,因此它可以使用它想要的任何线程,但是套接字区域绑定到 io_service,我不确定如何将客户端套接字从一个组件移动到另一个组件。

4

2 回答 2

4

你可以用asio::io_service::strand. io_service像往常一样创建一个线程池。与客户端建立连接后,从那里开始用io_service::strand. 每个客户一根。这基本上保证了从客户端的角度来看它是单线程的。

于 2009-12-21T19:34:11.290 回答
2

首先,我提倡考虑多进程方法;它是一个非常简单、易于推理和调试且易于扩展的架构。

可以水平扩展的服务器设计 - 服务器的多个实例,其中每个实例中的状态不需要在服务器之间共享(例如,共享状态可以在公共数据库中(SQL、Voldemort(持久)或Redis(集合和列表) - 非常酷,我对持久版本感到非常兴奋),memcached(不可靠)等) - 更容易扩展。

例如,您可以有一个侦听器线程,该线程在使用 UNIXsendmsg()传输描述符的多个服务器进程之间进行平衡。这种架构稍后可以直接迁移到带有硬件负载平衡器的多台机器上。

海报中的区域理念很有趣。可能是,您可以通过消息队列来完成所有操作,而不是锁定。原因是磁盘 IO(即使使用 SSD 等)和网络是真正的瓶颈,没有必要对 CPU 如此小心;线程之间传递的消息延迟并不是什么大问题,并且根据您的操作系统,线程(或进程)可以安排到 SMP 设置中的不同内核。

但最终,一旦达到饱和,要扩大面积理念,您需要更快的内核,而不是更多的内核。这是我们的一位主持人关于此的有趣独白

于 2009-12-08T17:24:52.693 回答