Python服务框架
Date: 2019/06/20 Categories: 工作 总结 Tags: 热更新
协议
Json Over HTTP (baseline)
Pro:
- 工具最完善
- 浏览器友好 (利于调试)
- 纯文本, 协议容易理解
Con:
- head-of-line blocking:
- HTTP1.1要并发请求必须建立多个TCP连接, 在同一条连接上,一个较慢的请求会阻塞后续包
- 使用时需自己拼装json, 校验不足
grpc
Pro:
- 支持所有主流语言
- 更丰富的生命周期管理
- 发送一个请求, 持续接受结果, 而无需等待所有结果接续后序列化为json
- 持续发送请求, 等待服务处理完毕后返回
- 双向流
- 使用Protobuf定义接口, 自动编译为代码
- 很多第三方的工具已经支持grpc接口, 比如tensorflow-serving
- 基于HTTP/2, 有完善的代理/负载均衡工具, 比如nginx/haproxy, 和其他工具, 网关/监控/中简件 (https://github.com/grpc-ecosystem)
- client-side load balancing and state management, 可以放心的重启服务, 而无需把节点从l5中下掉 避免了一些服务调用时不上报l5导致挂掉的服务一直报警
- 不依赖外部网络库
Con:
- Python中可能和其他非grpc服务结合需要起线程, 比如redis/mysql…
- 性能差, 各种rpc框架都拿来做baseline
Thrift
分为Apache Thrift和fbthrift两种
baidu-rpc
Pro:
- 性能强于grpc
Con:
- Only C++ implementation is opensourced right now.
框架
- Twisted: 比较早的(开始于2002年)Python 异步IO框架, 基于回调
- Tornado: 简化版的Twisted, 附带了web功能
- gevent: 协程, monkey-patch可以把第三方库(mysql/redis…)对socket的请求转换为异步
- asyncio: Python3引入的标准库, 使用新关键字async/await
从网上的benchmark来看, 这些框架速度上没有太大区别, 主要从易用性和积累方面选择
- WSGI服务器, 一般置于NGINX后面:
- uWSGI
- Gunicorn
- WSGI框架:
- Flask
- Django
结论
从生态系统的角度应该选择HTTP+JSON/grpc
如果是内部的微服务, 应该使用RPC框架, 这样可以快速开发和测试, 进化协议, 而且无需写client.
grpc和thrift都支持所有可能的语言, grpc更晚设计, 有一些更好的特性, 比如流
如果请求和返回格式比较简单, 且每个包数据量比较小可以考虑选择HTTP+JSON.