对 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

已有 5 条评论

  1. 陈放 陈放

    博主您好,能向您请教一个问题吗?这个fastapi的并发请求时间是可以减少的吗?

    1. syf syf

      你好,最近Python api写的很少了,吞吐量大的情况下看下具体什么资源紧张,CPU?内存?磁盘IO?网络IO?任务类型是啥样的?需要根据具体场景优化。可能的话向你安利下golang,Python作为解释型的语言这种场景下不会太快。或者可以考虑Cython

  2. 陈放 陈放

    当并发请求数量增加,它那个时间就会特别久,这个是和那个任务完成时间有关的吗,可是单一个任务就是零点4到5秒这样

  3. 陈放 陈放

    并发请求200,它就是使用了大概24秒这样

  4. synodriver synodriver

    请问Python系列的api是否运用了多进程部署以利用多核呢?比如Fastapi用的gunicorn uvicorn使用多进程启动,-k 参数

添加新评论