Libevent:用于处理HTTP保持连接的多线程

时间:2014-02-10 12:23:53

标签: c multithreading http libevent

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

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

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

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

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

- 还有其他我应该注意的问题吗?

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

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

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

0 个答案:

没有答案