对 python 的 Flask、FastAPI 和 Spring Boot 集成的简单接口做速度对比,返回 json 格式的当前时间戳:

{
    "timestamp":1584416801569
}

同时把某个11位时间戳 json string 写死在 index.html 里,测试 Nginx 的并发量。虽然一个静态资源一个动态计算没有可比性,但是为了体现性能差距,还是把 Nginx 的并发拿来做对比。

其他三种框架代码如下:

Spring Boot:

@RestController
public class MainController {
    @RequestMapping("/")
    public TimestampResult index() {
        return new TimestampResult();
    }
}
@Data
public class TimestampResult {
    private long timestamp;
    TimestampResult() {
        this.timestamp = System.currentTimeMillis();
    }
}

Flask:

@app.route('/')
def hello():
    return ujson.dumps({
        "timestamp": int(round(time.time() * 1000))
    })

FastAPI:

@app.get("/")
async def index():
    return ujson.dumps({
        "timestamp": int(round(time.time() * 1000))
    })

用 Docker 开一个 Ubuntu 系统的 Container,分配4核2G,安装好 python、jre 环境,部署上面四个程序,分别监听 18000、18001、18002、18003 这4个端口。

使用 jmeter 测试结果如下

Label平均值最小值最大值吞吐量
nginx_html3112233129.16597
flask_json18445245053.66379
fastapi_json39251212252.50794
springboot_json3812242585.76591
总体65124505994.21573

响应时间图.png
汇总图.png

从吞吐量的数据可以看到,对于简单的获取时间戳返回 json 的任务,SpringBoot 的性能相当好,甚至和 Nginx 托管静态文件相比差不了多少。而 Python 阵营的就要慢一些,新兴的 FastAPI 比老牌的 Flask 吞吐量要大上5倍左右,而 SpringBoot 的吞吐量差不多是 FastAPI 的10倍。从响应时间上来看 SpringBoot 则更是比 Python 系的要稳得多,和 Nginx 不分伯仲,相当令人惊讶。

当然这次测试是把4种服务放在同一个虚拟机下测试的,可能会涉及资源抢占、调度等等问题。设计上也可能会有没考虑到的地方有一些不合理之处。如果你有更好的想法或者有什么想说的,欢迎在下面评论。

标签: 测试, 高并发, FastAPI

添加新评论