网上有一些寥寥文章写有关Python微服务架构。目前Python微服务更多作为异构微服务系统中的功能性服务(比如数据计算,模型在线推理)。在系统架构中,诸如网关、注册中心和配置中心、负载均衡还有用的Spring Cloud那一套东西。所以Python微服务不得不向其兼容。
在一些文章中有提到关于nacos-sdk-python的使用方法,但是没有文章说在生产环境中的一些实践。
因为Python GIL限制,一般都是基于多进程部署(如使用Gunicorn pre-fork模型)。所以这导致Nacos相关数据应该与WSGI服务器绑定而不是与Flask实例绑定(多个Flask实例监听同一个端口)。
在传统Python web单体服务中,一般推荐的生产实践是使用Gunicorn的gevent工作模式,通过gevent的monkey补丁将同步IO替换为异步IO来提升并发性能。
所以这导致一个问题,如果使用gevent工作模式,那么虽然可以使用Gunicorn的钩子方法,在服务启动时向Nacos注册服务,并维持心跳。但是这样在gevent生效前就引入了SSL、Thread相关原生库,这可能导致gevent的monkey补丁失效。
目前我有三个思路:
1、使用牺牲并发性能,使用同步模式启动,则不会有monkey补丁失效的问题。
2、使用单进程(worker=1)的方式让服务与Flask实例绑定。
3、在程序初期就使用monkey补丁,让Gunicorn的钩子方法里就使用Gevent方式来注册服务。
希望分享Python微服务在生产环境中的部署方案。