`
tongqingqiu
  • 浏览: 24811 次
  • 性别: Icon_minigender_1
  • 来自: 亚特兰大
社区版块
存档分类
最新评论

REST API性能比较

    博客分类:
  • Java
阅读更多

REST已然成为最流行的提供外界服务API的方式。同时,随着互联网和物联网的普及,如今的应用需要处理大量并发的请求。因此,开发高性能REST服务已经成为一个成功应用的必备条件。

我这里集中讨论Java和JVM相关技术。基于Java的REST应用比基于python和ruby的应用往往具备更好的性能。而另外一些新兴的语言如Go超出了讨论的范围。

标准

JAX-RS是Java世界定义REST API的通用标准。Jersey 是JAX-RS的官方实现,(其他实现如rest-easy)。这是一个简单的Jersey REST GET例子。

@Path("myresource")
public class MyResource {

    /**
     * Method handling HTTP GET requests. The returned object will be sent
     * to the client as "text/plain" media type.
     *
     * @return String that will be returned as a text/plain response.
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt() {
        try {
            Thread.sleep(100); // do some job
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "Got it!";
    }
}



标准Jersey及其底层servlet实现最大的问题是每处理一个讲求,就需要一个相应的Socket线程处理。在成千上万的并发请求下,系统性能将会明显下降。

异步

为了解决这个问题,JAX-RS提出了异步的解决方案。在这种模式下,请求线程和用户连接之间的联系被打破。I/O容器不再假设等待请求完成,在关闭连接。这是上面简单的Jersey REST GET例子的异步实现:

@Path("myresource")
public class MyResource {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public void asyncGet(@Suspended final AsyncResponse asyncResponse) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                String result = veryExpensiveOperation();
                asyncResponse.resume(result);
            }

            private String veryExpensiveOperation() {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return "Got it!";
            }
        }).start();

    }
}




非阻塞


标准Jersey及其底层servlet实现最大的问题是每处理一个讲求,就需要一个相应的Socket线程处理。在成千上万的并发请求下,系统性能将会明显下降。

为了解决这个问题,JAX-RS提出了异步的解决方案。在这种模式下,请求线程和用户连接之间的联系被打破。I/O容器不再假设等待请求完成,在关闭连接。这是上面简单的Jersey REST GET例子的异步实现:


@Path("myresource")
public class MyResource {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public void asyncGet(@Suspended final AsyncResponse asyncResponse) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                String result = veryExpensiveOperation();
                asyncResponse.resume(result);
            }

            private String veryExpensiveOperation() {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return "Got it!";
            }
        }).start();

    }

}




使用异步技术可以大幅提高吞吐量,但是后端的工作已然需要创建独立的线程完成。系统的负担已然很大。

另外一种完全不同的实现是把“非阻塞”应用到方方面面,不仅仅是HTTP请求处理。在这种模式下,系统仅仅需要少量线程来检测事件的发生。使用这种方法最为重要的是将任务分解为一个个小部分。每个部分的执行事件非常短。Vert.x就是这样一个非阻塞,事件驱动,跨语言的开发框架。Node.JS则是另外一个JavaScript领域很流行的非阻塞框架。

上面简单REST服务的Vert.x实现如下



public class RestServer extends Verticle {
    public void start() {

        RouteMatcher rm = new RouteMatcher();
        rm.get("/myapp/myresource", new Handler() {
            public void handle(final HttpServerRequest req) {
                // sleep 100 ms
                vertx.setTimer(100, new Handler() {
                    public void handle(Long timerID) {
                        req.response().end("Got it");
                    }
                });
            }
        });

        vertx.createHttpServer().requestHandler(rm).listen(8080);
    }
}



我这里比较了jersey同步,异步和vert.x的实现。这里的服务实现工作100毫秒,然后返回结果。我使用gatling模拟了1000个用户并发,每个用户重复请求100次。测试结果显示vertx具有最高的吞吐率(即每秒中完成请求次数)5K和最低的平均时延105ms。Jersey异步居中,达到1K的吞吐量和300ms的平均时延。Jersey同步表现最差,吞吐量只有70,平均时延高达12秒。完整的例子在我的github项目vertx-jersey-benchmark。当然,这不意味着Vertx是所有人的最佳选择。Vertx也有很多问题。例如,Vertx缺少JAX—RS那样方便易懂的annotation来描述服务资源路径,参数等等。有一个第三方模块vertx-jersey试图将vertx和jersey集成。但是目前它的性能和jersey同步的性能差不多。

 

分享到:
评论

相关推荐

    H3C CAS REST API接口

    REST(Representational State Transfer)API是H3C CAS系统提供的一种接口方式,用于允许外部应用程序与CAS系统进行交互,实现系统的集成和二次开发。通过REST API,开发者可以远程操作和管理H3C CAS中的各种资源,...

    Building a Rest API with Spring

    8. 使用Spring的Etags实现REST:本节阐述了如何使用Etags来缓存控制,优化REST API的性能。 9. Spring中的REST分页:这部分讲解了如何在Spring中实现REST API的分页功能,使得客户端可以更方便地处理大量的数据集。...

    ActiveMQ与REST API实践

    **ActiveMQ与REST API实践** ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它遵循开放消息中间件标准——Java Message Service(JMS)。ActiveMQ以其高性能、稳定性和丰富的特性在分布式系统中广泛使用,...

    Rest api下载

    根据提供的文件信息,本文将对“Rest api下载”这一主题进行深入探讨,并结合描述与链接内容,提炼出关键知识点。 ### 一、Rest API简介 REST(Representational State Transfer)是一种网络应用程序的设计风格和...

    Rest api服务器配置

    10. **监控与日志**:部署后,对API性能、错误率、响应时间等进行监控是必要的。日志记录可以帮助排查问题,如使用Log4j、Logback等日志系统。 综上所述,配置Rest API服务器涉及多种技术和实践,从服务器环境的...

    跨平台的 REST API 客户端 Insomnia

    **跨平台的 REST API 客户端 Insomnia** Insomnia是一款功能强大的跨平台REST API测试和调试工具,专为开发者设计,便于与Web服务进行交互。它基于Electron框架构建,这意味着它能够运行在Windows、MacOS和Linux等...

    Total control rest api 脚本助手

    "Total Control REST API 脚本助手"是一个专为开发者设计的工具,旨在简化REST API的测试和管理过程。此工具提供了对RESTful API的全面控制,帮助用户进行模拟请求,执行基本操作,并且能够快速捕获接口响应的截图,...

    可轻松与RESTAPI集成的GraphQL指令

    标题中的“可轻松与REST API集成的GraphQL指令”是指一种特定的GraphQL工具或技术,它简化了在GraphQL服务中对接RESTful API的过程。GraphQL是一种强大的查询语言,它允许客户端定义他们需要的数据,而不是服务器...

    REST API.md

    REST API的优点:缓存Cache提高响应性能,本身的“无状态”和“扩展性”,不需要额外的资源发现机制 REST 、DO、RPC之间区别对比 REST与CORBA、SNMP、SOAP比较 腾讯开放平台REST API 示例 通过URL来设计系统...

    C# REST API

    在IT行业中,C# REST API开发是构建现代网络服务的核心技术之一。REST(Representational State Transfer)是一种架构风格,用于设计分布式系统,尤其是Web服务。本篇将详细讲解如何使用C#来创建一个REST API,并...

    sharepoint rest search api

    使用像Postman这样的API测试工具,可以帮助调试和测试SharePoint REST Search API请求,确保正确性和效率。 总之,SharePoint REST Search API为开发人员提供了一种强大而灵活的方式来整合和扩展SharePoint的搜索...

    rest api 接口测试工具

    总之,REST API接口测试工具如Advanced REST Client是开发者和测试人员不可或缺的工具,它们帮助确保REST API的质量、性能和安全性。了解和熟练使用这些工具,对于提升Web服务的开发效率和质量具有重要意义。

    odoo rest_api

    9. **分页与性能优化**:对于大量数据,REST API支持分页查询,通过`?offset`和`?limit`参数控制返回结果的数量。此外,使用正确的过滤策略和缓存机制也是提高性能的关键。 10. **版本管理**:Odoo的REST API可能会...

    REST api demo

    这个"REST api demo"项目提供了学习和实践REST API设计和实现的一个基础平台,对于理解如何将这些技术结合使用以构建现代Web服务非常有帮助。通过深入研究和扩展这个项目,开发者可以更好地掌握RESTful API设计原则...

    ES-RestAPI技术分享.docx

    ### Elasticsearch与ES-RestAPI技术概述 #### 一、Elasticsearch简介 Elasticsearch是一款高性能的分布式搜索和分析引擎,适用于实时数据处理场景。它基于Lucene构建,提供了强大的分布式多用户全文检索功能,通过...

    REST_API_C#_sample

    RESTful API,全称为Representational State Transfer,是一种网络应用程序的设计风格和开发方式,基于HTTP协议,用于...此外,还可以了解到如何与数据库交互、进行身份验证和授权,以及如何优化API性能等高级话题。

    Rest 开发API.

    ### REST API开发详解 #### REST概述 REST(Representational State Transfer),即表述性状态转移,是一种用于设计网络应用和服务的架构风格。它基于一套简单的原则和规则,利用现有的网络协议和标准来构建灵活且...

Global site tag (gtag.js) - Google Analytics