我们的分析服务器是用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上的相关帖子:Large number of simulteneous connections in thrift
话虽这么说,你不一定能够更快地完成工作(处理程序 仍然在线程池中执行),但更多客户端将能够立即连接到您。
只是想知道我在这里还有其他因素吗?我该怎样决定哪一个最符合我的需求?
答案 0 :(得分:6)
完成50-600毫秒的请求很长。创建或销毁线程所花费的时间远远少于此,因此此时不要让这个因素进入您的决策。我会选择最容易支持的那个,这是最容易出错的。您希望最大限度地减少细微并发错误的可能性。
这就是为什么编写单线程事务处理代码通常更容易,这些代码阻塞了它需要的地方,并且有许多并行运行,而不是拥有更复杂的非阻塞模型。被阻塞的线程可能会降低单个事务的速度,但它不会阻止服务器在等待时执行其他工作。
如果您的事务负载增加(即更多客户端事务)或请求变得更快(每个事务接近1毫秒),则事务开销变得更加重要。要注意的指标是吞吐量:每单位时间完成的交易数量。单个交易的绝对持续时间不如它们完成的速度重要,至少如果它保持在一秒以下的话。