2010-08-22 20 views
11

我们的分析服务器是用C++编写的。它基本上查询底层存储引擎,并通过节俭返回相当大的结构化数据。典型的请求将需要大约0.05到0.6秒才能完成取决于请求大小。TNonblockingServer,TThreadedServer和TThreadPoolServer,哪一个最适合我的情况?

我注意到我们可以在C++代码中使用的Thrift服务器有几个选项,特别是TNonblockingServer,TThreadedServer和TThreadPoolServer。看起来像TNonblockingServer是一条路,因为它可以支持更多的并发请求,并且仍然使用场景后面的线程池来处理任务。它也避免了构造/破坏线程的成本。

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

在这里,在Facebook上,我们是完全异步客户端和服务器上工作了C++。这 服务器使用像目前TNonblockingServer事件驱动I/O,但其 应用程序代码的接口都是基于异步回调。这将允许我们写一个可以服务于数以千计的并发请求的 服务器(每个需要 打电话给其他储蓄或内存缓存服务器),只有少数线程。

上stackover相关文章:Large number of simulteneous connections in thrift

话虽这么说,你也不一定能真正做到提高工作效率(处理 线程池中仍然执行),但更多的客户会能够立即连接到你。

只是想知道是否有其他的因素,我在这里失踪?我怎样才能决定哪一个最适合我的需求?

回答

5

请求采取50-600毫秒才能完成相当长。创建或销毁线程所花费的时间远远少于此,所以请不要将此因素纳入当前的决策。我会选择一个最容易支持的,而且这是最不容易出错的。您希望最小化微妙的并发错误的可能性。

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

如果您的事务负载增加(即更多的客户端事务)或请求变得更快(每个事务接近1毫秒),则事务开销将变成更重要的因素。需要注意的指标是吞吐量:每单位时间完成多少事务。单次交易的绝对持续时间并不比完成交易的时间重要,至少如果持续低于一秒钟的话。

4

一个上Github家伙已经打了一个漂亮的比较

TThreadedServer

TThreadedServer派生为每个客户端连接一个新的线程,直到客户端连接被关闭每个线程仍然活着。这意味着如果有1000个并发客户端连接,TThreadedServer需要同时运行1000个线程。

TNonblockingServer

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

TThreadPoolServer(此处未基准)

TThreadPoolServer类似于TThreadedServer;每个客户端连接都有自己的专用服务器线程。它与TThreadedServer有两种不同之处:

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