最开始我们的业务架构是 all Python,api 服务使用 flask + celery + redis + mongdb + 基于 thrift 的 C++服务, 处理简单的图片分类。
转的原因:后面来了一个业务需求,对 api 的响应速度和 qps 都有要求,基本上是几千 qps 每秒。因为本身的业务逻辑比较简单,所以我们 profiling 了下,发现瓶颈在 Python 本身。我以前用过 Golang,所以基于 Gin 框架实现了一个简单的业务逻辑进行压测,发现性能比 Python 好很多,达到我们的预期。
工程效率对比:
- 一个是响应时间快了不少,Python 的话能优化的空间有限,而且效果也不是很理想
- 单机支持的 qps 提升很多,不需要增加线上的机器就可以满足新需求
上面这两个提升基本是 5 倍左右吧,具体记不清了
然后我们基于 Golang 实现了原来的鉴别服务,达成了项目需要。
遇到的坑:
- 包生态还不完善。我们重度依赖 Celery,Golang 当时没有类似 Python Celery 这个库,所以只能参考 Celery 的原理实现一个类似的。还有一些基于 Pandas 的代码还是保留 Python 版本。
- Golang 的包版本管理以及下载比较麻烦,本地有代理还好,线上部署如果是实时拉代码的话很麻烦。后来我们把需要的库都本地打包到 docker 镜像里作为 base image。
其他收益
相比 Python 好的地方
- Golang 的类型检查和基于防御性编程的错