TNonblockingServer,TThreadedServer和TThreadPoolServer,哪一个最适合我的情况?

Ale*_*ong 13 c++ multithreading thrift nonblocking threadpool

我们的分析服务器是用c ++编写的.它基本上查询底层存储引擎,并通过thrift返回相当大的结构化数据.典型的请求大约需要0.05到0.6秒才能完成,具体取决于请求大小.

我注意到我们可以在c ++代码中使用哪些Thrift服务器,特别是TNonblockingServer,TThreadedServer和TThreadPoolServer.看起来像TNonblockingServer是要走的路,因为它可以支持更多的并发请求,并且仍然使用场景后面的线程池来完成任务.它还避免了构造/破坏线程的成本.

Facebook关于节俭的更新:http://www.facebook.com/note.php? note_id = 16787213919

在Facebook,我们正在为C++开发一个完全异步的客户端和服务器.此服务器使用事件驱动的I/O,如当前的TNonblockingServer,但它与应用程序代码的接口都基于异步回调.这将允许我们编写服务器,只需几个线程即可服务数千个同时发出的请求(每个请求都需要调用其他Thrift或Memcache服务器).

stackover上的相关帖子:节俭中的大量同时连接

话虽这么说,你不一定能够更快地完成工作(处理程序仍在线程池中执行),但更多的客户端将能够立即连接到你.

只是想知道我在这里还有其他因素吗?我该如何确定哪一个最适合我的需求?

Mar*_*ies 7

Github上的一个人做了很好的比较

TThreadedServer

TThreadedServer为每个客户端连接生成一个新线程,每个线程保持活动状态,直到客户端连接关闭.这意味着如果有1000个并发客户端连接,则TThreadedServer需要同时运行1000个线程.

TNonblockingServer

TNonblockingServer有一个专用于网络I/O的线程.同一个线程也可以处理请求,或者您可以为请求处理创建单独的工作线程池.服务器可以使用少量线程处理许多并发连接,因为它不需要为每个连接生成新线程.

TThreadPoolServer(未在此处进行基准测试)

TThreadPoolServer类似于TThreadedServer; 每个客户端连接都有自己的专用服务器线程.它与TThreadedServer在两个方面有所不同:

客户端关闭连接以供重用后,服务器线程返回到线程池.线程数有限制.线程池不会超出限制.如果线程池中没有可用的线程,客户端将挂起.与其他2台服务器相比,它使用起来要困难得多.


Ran*_*ook 6

完成50-600毫秒的请求很长.创建或销毁线程所花费的时间远远少于此,因此此时不要让这个因素进入您的决策.我会选择最容易支持的那个,这是最容易出错的.您希望最小化细微并发错误的可能性.

这就是为什么编写单线程事务处理代码通常更容易,这些代码阻塞了它需要的地方,并且有许多并行运行,而不是拥有更复杂的非阻塞模型.被阻塞的线程可能会降低单个事务的速度,但它不会阻止服务器在等待时执行其他工作.

如果您的事务负载增加(即更多客户端事务)或请求变得更快(每个事务接近1毫秒),那么事务开销就变得更加重要.要注意的指标是吞吐量:每单位时间完成的交易数量.单个交易的绝对持续时间不如它们完成的速度重要,至少如果它保持在一秒以下.