Libevent:multithreading处理HTTP保持连接

我正在使用Libevent在C中编写HTTP反向代理,我想实现multithreading以利用所有可用的CPU内核。 我看了一下这个例子: http : //roncemer.com/software-development/multi-threaded-libevent-server-example/

在这个例子中,似乎一个线程用于连接的整个持续时间,但对于HTTP 1.1,我不认为这将是最有效的解决方案,因为默认情况下连接在每个请求后保持活动状态,以便它们可以重用后来。 我注意到,即使一个浏览器面板也可以打开几个连接到一个服务器并保持打开,直到选项卡关闭,这将立即耗尽线程池。 对于HTTP 1.1代理,将有许多开放连接,但只有极少数人在给定时刻主动传输数据。

所以我在想一个替代方案,为所有传入连接创建一个事件库,并将事件回调函数委托给工作线程。 这样我们可以有许多打开的连接,只有当数据到达连接时才使用线程,一旦处理完数据就将其返回池中。

我的问题是:这是一个与Libevent合适的线程实现吗?

具体而言 – 是否需要在每个连接中都有一个事件库,如示例中所示,或者所有连接都足够?

另外 – 我还应该注意其他任何问题吗?

目前我能看到的唯一问题是突发性,当在许多小块中接收到数据时,每个HTTP响应触发许多读取事件,这将导致大量切换到工作线程。 这会是个问题吗? 如果它会,那么使用Libevent的水印可能会有点否定,虽然我不确定如果请求到达两个块并且第二个块足够小以使缓冲区大小低于水印,这是如何工作的。 它会留在那里直到更多数据到来吗?

此外,我需要实现调度,以便只有在前一个块完全发送后才会发送一个块。

我想到的第二个问题是当线程池耗尽时,即所有线程当前正在执行某些操作,并且发生另一个读取事件 – 这将导致读取事件回调阻塞。 那有关系吗? 我想把这些放到另一个队列中,但肯定这正是事件库内部发生的事情。 另一方面,第二个队列可能是组织块的调度而不阻塞工作线程的好方法。