Thrift Servers性能对比
Thrift 是一个跨语言的序列化/rpc框架,它有三个主要组成:协议protocol,传输transport和服务server。协议定义消息如何被序列化的。传输定义消息如何在client与server之间传送。server从transport收到序列化后的消息,按照协议反序列化消息然后调用用户定义的消息处理函数,然后反序列化hander来的response再写回transport。Thrift的模块化架构使得它能有多样的servers可选。下面是java中可用server的列表:
TSimpleServer
TNonblockingServer
THsHaServer
TThreadedSelectorServer
TThreadPoolServer
有选择是好事,但哪个server才适合你?在这篇文章里,我将描述各servers之间的不同并通过benchmark结果来阐述性能特点(在附录B中有详细benchmark)。让我们从最简单的一个开始:TSimpleServer
TSimpleServer
TSimpleServer接收一个连接,处理这个连接上的请求直到client关闭该连接,才去重新接受一个新连接。因为所有事情都在一个线程且是阻塞I/O, 它仅能同时服务一个连接,其他client不得不等待直到被接收。TSimpleServer主要用于测试目的,不要在生产环境中使用。
TNonblockingServer VS THsHaServer
TNonblockingServer使用非阻塞I/O解决了TSimpleServer一个client会阻塞所有其他client的问题。它使用 java.nio.channels.Selector, 通过调用select()允许你阻塞在多个连接上而不是一个连接。当一个或多个连接可接受/读/写时 select() 返回。TNonblockingServer 处理这些连接要么接受连接,要么从此读数据或写数据到连接,并再次调用select()等待下个可用的连接。安装这种方式,可以服务多个client而不会一个client饿死其他client。
然而,有个棘手问题。消息都是由调用select()的线程来处理的. 让我们假设有10个client,每个消息处理需要100ms。延迟和吞吐量多少?当一个message被处理的时候,其他9个client等待被选择,所以,需要1sclient才能得到server返回的response,吞吐量事10 req/s。如果消息能被同时处理是不是会好很多?
这就是THsHaServer(半同步/半异步服务)的切入点。它使用单线程处理网络io,和分开的工作线程池处理消息处理。这样如果有空闲的工作线程,消息就会立马被处理,多个消息也能被并行的处理。使用上面的例子,现在延迟事100ms,吞吐量奖是100 req/s.
为了证明这点,我运行了一个benchmark,有10个client和一个消息处理函数,消息处理仅仅是简单sleep 100ms然后返回。我使用10工作线程的THsHaServer。 handler如下所示:
public ResponseCode sleep() throws TException
{
try {
Thread.sleep(100);
} catch (Exception ex) {
}
return ResponseCode.Success;
}
结果正如期望。THsHaServer能同时并行处理所有请求,而TNonblockingServer一次处理一个。
THsHaServer vs. TThreadedSelectorServer
Thrift 0.8引入另一种server,TThreadedSelectorServer。TThreadedSelectorServer和THsHaServer最大的不同是允许你有为网络I/O分配多个线程。它保持两个线程池,一个为了处理网络I/O, 一个处理请求。TThreadedSelectorServer在网络io是瓶颈时表现比THsHaServer好。为了显示他们的不同,我运行一个处理函数不做任何事立即返回的benchmark, 并测量不同client数量下的平均延迟和吞吐量。我使用32线程的THsHaServer 和16工作线程/16selector线程的TThreadedSelectorServer。
结果显示TThreadedSelectorServer比THsHaServer有更高的吞吐量且更低的延迟。
TThreadedSelectorServer vs. TThreadPoolServer
最后是TThreadPoolServer, TThreadPoolServer和其他3个servers不同地方在于:
有一个专用线程接受连接
一旦一个连接被接受了,被安排给ThreadPoolExecutor中一个工作线程来处理
这个工作线程服务该指定client连接直到关闭。一旦该连接关闭,该工作线程回到线程池
你可以配置线程池的最小和最大线程数。对应的默认值事5和Integer.MAX_VALUE
这意味着如果有10000个并发client连接,你需要运行10000个线程。就本身而论,这不如其他servers对资源友好。并且,如果client的数量超过线程池的最大数值,请求将被阻塞住直到有工作线程可用。
话虽如此,TThreadPoolServer表现的非常好;我用它支撑10000个并发连接没有任何问题。如果你能提前知道你的client数目并且也不介意多一点线程,TThreadPoolServer对你可能是个好选择。
我希望这篇文章能帮你决定哪种Thrift server适合你。
我觉得对于多数情况TThreadedSelectorServer是个安全的选择。如果你你可以接受运行大量并发进程,你也可以考虑TThreadPoolServer。
相关推荐
《ice-dubbo-thrift-grpc性能测试对比》 在IT领域,选择合适的RPC(远程过程调用)框架对于系统的性能和可扩展性至关重要。本文主要分析了四种常见的RPC框架——ice、dubbo、thrift和grpc的性能表现,通过一组简化...
### Netty+Thrift 实现高并发高性能的关键技术解析 #### 一、引言 在当前互联网技术高速发展的背景下,高性能、高并发的服务框架成为众多企业和开发者追求的目标。Netty作为一款高性能、异步事件驱动的网络应用...
这个名为"protobuf/thrift/avro-序列化性能测试工程"的项目专注于对比这三种技术的性能。 protobuf是Google开发的一种高效的数据序列化协议,它提供了简洁、快速和跨平台的序列化方法。protobuf通过定义.proto文件...
6. **性能比较**:由于thrift-0.13.0是根据HBase源码生成的,它可能更贴合HBase的内部机制,从而提供比gohbase更高的效率。然而,实际性能差异可能取决于具体的应用场景和优化程度。 总的来说,"thrift-0.13.0.zip...
- 监控:在生产环境中,定期抓取Thrift流量可监控服务的健康状况,及时发现潜在的性能瓶颈。 总之,结合Wireshark和Thrift dissector,我们可以深入洞察Thrift协议的网络交互,这对于开发、调试和维护Thrift服务...
Thrift是Facebook开源的一款高性能、跨语言的服务框架,它的设计目标是高效地在不同编程语言之间进行通信。本文将基于Thrift的Java实现,总结学习过程中的一些关键知识点,旨在帮助理解Thrift的工作原理以及如何在...
配置好环境后,开发者可以使用 Thrift 实现高性能的服务之间的远程过程调用,提高系统的整体性能。 Thrift 环境配置步骤 ------------------------- ### 步骤 1:安装 MacPorts MacPorts 是一个用于 macOS 的包...
总的来说,Thrift与Dubbo的集成可以带来更高效的跨语言通信能力,适用于需要多语言支持且对性能有较高要求的服务。通过合理地配置和使用,可以提高系统的可扩展性和灵活性。不过,这也需要开发者对Thrift的原理和...
Thrift是一种开源的跨语言服务...总的来说,Thrift是一个强大且灵活的工具,它在各种跨语言通信场景中都展现出了优秀的性能和便利性。通过理解Thrift的工作原理和安装过程,你可以更好地利用它来解决实际的开发问题。
Thrift是一种高效的、跨语言的服务框架,最初由Facebook开发,现在是Apache的顶级项目。它提供了强大的代码生成工具,可以从接口定义文件(IDL)生成多种编程语言的客户端和服务端代码,使得不同语言之间可以轻松地...
Thrift 是一个高性能的跨语言服务开发框架,最初由 Facebook 开发并开源。它通过接口定义语言(IDL)来定义数据类型和服务,使得不同语言之间能够进行高效且可靠的通信。Thrift IDL 文件被编译成多种编程语言的代码...
在IT行业中,Thrift是一种高性能、可扩展的跨语言服务开发框架,由Facebook开源,用于构建分布式服务。它通过定义一种中间表示(IDL,接口定义语言)来描述服务,然后自动生成不同编程语言的代码,使得不同语言之间...
Thrift是由Facebook开源的一个高性能、可扩展的跨语言服务开发框架。它的主要功能包括自动生成服务接口、客户端和服务器端代码,简化了服务之间的通信。 本文将详细讲解基于Thrift的RPC框架,并重点介绍如何在其...
Thrift是一种高性能的跨语言服务框架,由Facebook于2007年开发并开源,现已成为Apache软件基金会的顶级项目。它的主要目标是解决分布式系统中的通信问题,通过提供一套代码生成工具,使得开发者可以方便地在不同的...
而Thrift则是一种开源的软件框架,用于构建可伸缩的服务,它支持多种编程语言,包括C++,并且允许不同语言之间进行高效的数据交换。在这个“C++(Qt)下的thrift的使用示例”中,我们将探讨如何在Qt项目中集成和使用...
Thrift 是一种高性能的通讯中间件,支持多种编程语言,可以实现跨语言和跨平台的数据交换和 RPC 服务。Thrift 由 Facebook 开源,于 2007 年提交 Apache 软件基金会。Thrift 可以支持多种编程语言,如 C++、C#、...
总结,Laravel开发与Thrift-Laravel的结合,让开发者能够充分利用Laravel的便利性和Thrift的高性能特性,构建出可扩展、易于维护的分布式系统。通过理解和掌握Thrift-Laravel,开发者可以提升服务之间的通信效率,...
Thrift,全称为“Transportation Layer Security”,是由Facebook开源的一款高性能、跨语言的服务框架。它最初设计的目的是解决大规模分布式系统中的数据通信问题,通过定义一种中间表示(IDL,Interface Definition...
2. **高性能**:Thrift使用高效的二进制协议进行序列化和通信,相比XML或JSON,数据传输更紧凑,性能更好。 3. **易于使用**:通过简单的IDL定义,可以快速地在各种语言间建立通信接口。 4. **轻量级**:Thrift...
12. **性能优化**:Thrift的高性能得益于其轻量级的通信模型和高效的序列化机制,但在实际应用中,还需要根据场景调整服务器配置,优化网络通信,以获得最佳性能。 总结,这个“thrift包及其源码”为学习和使用...