最佳高并发Python/Redis服务器



我正在原型设计一个基于Python/Redis的API,并使用Bottle提供JSON,但不幸的是,开箱即用的Bottle在负载和高并发情况下表现不佳。一些对真实流量的初始测试导致python脚本在没有终止的情况下崩溃,这意味着API没有响应并且没有重新启动*。

就性能和文档而言,目前扩展Python/Redis API的最佳解决方案是什么。我发现bottle+greenlet解决方案文档不足,对于像我这样的Python初学者来说不容易实现。我听说龙卷风很好,但它与Redis的集成比bottle的慢。

*似乎当bottle无法将HTTP请求的主体发送到客户端时,服务器会出现"[Erno 32]Broken pipe"错误,这似乎是服务器停止工作的坏原因

你已经读过关于这个主题的Bottle文档了吗?

Bottle在重负载下表现非常好——我每天用它来处理数百万个请求——但如果您需要并发性或高性能,则不能使用其默认的HTTP服务器。(默认情况下,Bottle只使用wsgiref.WSGIServer,它是单线程的,不适用于任何高性能应用程序。(

在生产中,我使用mod_wsgi在Apache中运行Bottle。(这是一个例子。(伸缩性非常好;瓶子本身增加的开销微不足道。

换句话说:您的性能瓶颈不是由Bottle引起的,而是由您的HTTP服务器引起的。选择一个可扩展的服务器,您会看到更好的性能。

希望能有所帮助!


2015版

我发现Bottle有它的局限性,对于更大的并发性(每个内核数千个QPS(,Bottle是做不到的。(瓶颈似乎是Bottle对线程本地存储的使用和gevent的TLS实现之间的交互。(我没有使用falcon,它在高负载下的性能比Bottle要好得多。

如果你是初学者,你不应该从evented(twisted/dontone/gevent/eventlet…(libs开始。

它会把你带到你不知道的地方!

如果您需要扩展,请添加机器并使用负载平衡器平衡负载。

根据应用程序的特定需求,您可能会从我的多线程Python WSGIServer实现中受益。(这是我自己博客上的页面。(

它是wsgiref.WSGIServer的临时替代品,因此您可以将其与Bottle一起使用,只需进行最小的更改。

基本上,它有点像Apache的workerMPM(但有一个进程(:每个请求都将由N个预分配线程池中的自己的线程处理。

我发现它在我想要Bottle应用程序中的并发性,但我不喜欢使用Apache或引入任何其他重要的服务器依赖性的情况下很有用。

这里有一个例子:

import bottle
import time
app = bottle.Bottle()
@app.route('/')
def foo():
    time.sleep(2)
    return 'hello, world!n'
app.run(server=MTServer, host='0.0.0.0', port=8080, thread_count=3)
# Here, app is nonblocking; it will handle up to 3 requests concurrently.
# A 4th concurrent request would block until one of the first 3 completed.

如果你尝试一下,请告诉我,它是如何工作的。(欢迎提出建议和贡献。谢谢!(

(将其作为一个单独的答案添加,因为它比我之前的答案更激进。(

最新更新