基于实际应用程序的Web REST API性能测试

1,395 阅读4分钟

原文链接:

link.zhihu.com/?target=htt…

作为一名网络自由职业者,我对不同框架和技术的性能很感兴趣,但是,在互联网上发现的大多数性能测试,只考虑了hello World示例。

实际上,在构建实际应用程序时,需要考虑的方面更多。因此,我决定在最流行的框架和技术之间运行一个完整的性能测试。

除了性能之外,我还对在每个框架中实现特定任务的容易程度以及扩展性能的成本感兴趣。

候选框架和技术有哪些?

  1. Laravel 5,PHP 7.0,Nginx

  2. Lumen 5,PHP 7.0,Nginx

  3. Express JS 4,Node.js 8.1,PM2

  4. Django,Python 2.7,Gunicorn

  5. Spring 4,Java,Tomcat

  6. .NET Core,Kestrel

我们测试什么?

我们感兴趣的是每个框架在不同服务器配置上每秒钟实现的HTTP请求数量,以及代码的简洁或冗长程度。

服务器的配置看起来怎么样?

我们还对每个框架如何扩展其性能以及实现这种性能的代价感兴趣。这就是我们将使用DigitalOcean在3种不同的服务器配置上测试它们的原因。

  1. 1 CPU,512 MB - $5/month

  2. 4 CPU,8 GB - $80/month

  3. 12 CPU,32 GB - $320/month

我们构建的是什么?

我们想测试一个真实的应用程序示例,因此我们将构建一个Web REST API,这个API公开4个接口,每个接口具有不同的复杂性。

  1. Hello World ——只需响应包含Hello World字符串的json数据。

  2. 计算——计算前10,000个斐波那契数列。

  3. 简单列表——有一个MySQL数据库,其中包含一个country表,然后返回包含所有国家的列表。

  4. 复杂列表——增加一个user表,在user表和country表之间有多对多映射关系。然后返回结果:所有去过法国的用户,以及这些用户去过的所有国家。

为了构建最后两个接口,我们将使用每个框架提供的工具以及最简单的运行方式来实现我们的目标。

我们如何测试它们?

为了更好地测试性能,我们同时使用wrk和ab 这两种HTTP性能测试工具,来检查我们是否得到了类似的结果,并更改请求的并发度,以便每种技术都能体现出其最大潜力。

这些工具将在DigitalOcean上独立创建的droplet服务器上运行,它们不会与实际的API应用程序来竞争服务器资源。

此外,用于测试请求的服务器和用于运行应用程序的服务器都使用它们的私有ip进行连接,因此不会有明显的网络延迟。

性能测试结果

下面,您可以看到每个API接口的测试结果,还可以看到每个框架在不同服务器配置上的性能扩展情况。

API如何构建?

下面是每个框架的实际controller,您可以在Github上查看相关代码。

  1. Laravel with PHP和Lumen with PHP

  1. Express JS with Node.js

  1. Django with Python

  1. Spring with Java

  1. .NET Core

结论

请记住,在实际应用程序中,几乎所有的请求都和数据库交互。选择这些框架中的任何一个来运行都可以,它们都能够处理大多数web应用程序的需求。

但是,比较而言,Node.js上的Express JS的性能还是相当出色的。它与Java和.NET Core之间相互竞争,它的性能甚至超过了Java和.NET Core。并且,Express JS结合了Javascript ES6的简单性,您可以在Node.js 8中直接使用它。

对于应用的可扩展性,我们在中等配置的服务器上得到了最好的性能/开销比。增加到12个CPU核心和32GB内存并没有带来太多帮助。在这种情况下,瓶颈可能出现在系统的其他地方,需要进一步深入分析和调整以使服务器性能达到更好的状态。

如果您觉得这个测试很有趣,可以点击下方的链接,查看本次性能测试相关的所有源代码。

github.com/mihaicracan…

未经同意,本文禁止转载或摘编。