Python异步网络服务器

时间:2016-10-25 06:36:09

标签: python-2.7 asynchronous webserver rpc uwsgi

在工作中,我们将Python 2.7用于所有微服务。我们的大多数服务都有很少的业务逻辑,但足以不使用所有现成​​的即插即用框架。因此,我们的前端反应仪表板主要是REST / CRUD。所以我们使用:

Python 2.7

  • ha代理用于循环服务器和服务之间的呼叫。
  • nginx在每台服务器上解析并调用uwsgi
  • uwsgi处理多个进程(当然我们的代码不是线程安全的) - 每个cpu 2个进程,每个进程1个进程。
  • 金字塔在内部调用SQL炼金术来插入MySQL服务器。
  • 弹性搜索
  • couchbase
  • 用于依赖注入的Spring Python
  • 一堆自制的包装器来绑定所有这些并使其可用。
  • json到处都是

我们还有工人和rpc插入rabbitmq。

正如我所说,服务器的大部分工作是:解析request / json,执行sql或弹性搜索查询,格式化前端,并做出响应。执行请求时有很多缓慢的IO。现在我们有越来越多的服务间呼叫,我们使用http调用或rmq-rpc与rabbitmq。我们设计了一个包装器来调用我们的路由,这样就可以在http或rmq-rpc中调用它们而没有任何区别。

拥有c#/ go后台,我习惯于拥有可以处理异步而没有太多问题的高效Web服务器,即使我们在http调用期间执行了大量IO请求,也可以扩展。但是使用uwsgi几乎是不可能的,因为每次我们通过sql-alchemy调用MySQL它会阻塞整个线程/进程,我们无法扩展那么多,我们只需添加更多服务器。我们可以为每个cpu添加更多进程,但这感觉不对,只是推迟了pb,我们可能会遇到内存问题(我们有本地缓存​​来加快速度。)

所以我读到了关于python,gevent,tornado,twisted等的异步内容,看起来很棒,但似乎与sql炼金术不太合作。关于烧瓶,Django的东西。但我们不需要花哨复杂的Web框架,只需简单的http路由。

筹码是3岁,我们无法改变一切。商品新闻,我们与uwsgi和金字塔有很松散的耦合,但是Spring Python和SQL炼金术的联系非常紧密。我们可以找到一种方法来使我们的路线成为线程保险箱。

所以我的问题是,鉴于我所说的,你会推荐哪些堆栈,以及那些严格的限制?

  • http - rpc应该处理相同。
  • rpc不必通过rabbitmq。
  • json(我们不能移动到protobuf)。 我们的大多数路由只是对“数据库”(sql或elastic或couchbase)的调用,所以我们主要是IO绑定。
  • 我们有很多遗留代码,所以没有从头开始

我打算测试一些想法,但如果你能指出我正确的方向,那可能会节省我很多时间。

奖励:如果你必须从头开始,你会用什么? (仍然使用python 2.7和sql alchemy)

感谢您的帮助。

免责声明:我知道这是某种开放式问题,但关于堆栈the last questionsthe subjectleast 3 years oldI posted the same question on reddit without luck.

1 个答案:

答案 0 :(得分:0)

我认为你真的需要使用支持async的db驱动程序,postgres的psycopg2我可以这样做。

这不是sqlalchemy或金字塔的直接问题(特别是因为您可以在金字塔中设置不使用全局变量的东西)。

我一直在编写一个带金字塔和gevent的websocket服务器,效果很好。它不使用sqlalchemy,但诀窍是你不得对sqlalchemy代码使用范围会话,这是异步的。