elasticsearch,tornado,connection-pooling,pool,Asynchronous,elasticsearch,Tornado,Connection Pooling,Pool" /> elasticsearch,tornado,connection-pooling,pool,Asynchronous,elasticsearch,Tornado,Connection Pooling,Pool" />

Asynchronous 多进程Tornado中的异步连接池

Asynchronous 多进程Tornado中的异步连接池,asynchronous,elasticsearch,tornado,connection-pooling,pool,Asynchronous,elasticsearch,Tornado,Connection Pooling,Pool,我正在使用Tornado 4.2.1和Tornados 2.4.1库来查询我的Elasticsearch数据库,我正在寻找一种方法来初始化连接池,以便在多进程服务中的多个RequestHandler实例之间共享 有可能吗?Tornado是否有专门的库来实现这一点 提前感谢因为tornado es只是一个HTTP客户端,它在中使用。除非指定了connection:keep-alive头,否则每次请求都会创建新TCP连接 conn = ESConnection() conn.httprequest_

我正在使用Tornado 4.2.1Tornados 2.4.1库来查询我的Elasticsearch数据库,我正在寻找一种方法来初始化连接池,以便在多进程服务中的多个RequestHandler实例之间共享

有可能吗?Tornado是否有专门的库来实现这一点


提前感谢

因为tornado es只是一个HTTP客户端,它在中使用。除非指定了
connection:keep-alive
头,否则每次请求都会创建新TCP连接

conn = ESConnection()
conn.httprequest_kwargs['headers'] = {'Connection': 'keep-alive'}
我还没有测试过,但应该可以用。我在ruby中使用了类似的设置(使用http客户机),效果很好

下一件事

AsyncHTTPClient
对每个ioloop的最大同时请求数(
fetch
)有限制。每个达到限制的请求都只是在内部排队

您可能希望增加全局限制:

AsyncHTTPClient.configure(None, max_clients=50)
或者使用自己的限制来分隔客户端(
force\u实例
):

最后

要重用同一个ESConnection,您可以在应用程序中创建它,因为应用程序可用于每个请求(RequestHandler)

多进程

其实没有简单的办法。常用的方法是pooler,它主要在需要持久连接时使用,如数据库(用于postgres)或作为高负载服务的优化

您必须编写一个池,一个到es的网关应用程序

subprocess1 
           \  (http, zmq, ...)
            \            
              > pooler (some queue and tornadoes api) - http -> elastisearch
            /
           /
subprocess2

子流程可以通过HTTP(甚至pooler)或(sockets,…)的一些实现与pooler通信

你好,kwarunek,非常感谢你的回答。我完全理解你说的话,而且效果很好。我唯一不明白的是,是否可以将它用于多个子流程。在我的main中,我实现了一种机制,从命令行中可以得到要启动的子进程的数量:
http\u server=tornado.httpserver.httpserver(MyApp)
http\u server.bind(8888)
http\u server.start(tornado.options.options.processs)
tornado.ioloop.ioloop.current().start()
是否可以在多个子进程中使用您的示例?我试图用两个子进程启动Tornado,但出现以下错误:
RuntimeError:无法在多个进程中运行:IOLoop实例已初始化。在调用start_processs()之前不能调用IOLoop.instance()
。我已经添加了关于多进程的说明。运行时错误可能是由于在分叉之前创建AsyncHTTPClient造成的,这非常感谢@kwarunek,太完美了!
from tornado.web import Application, RequestHandler
from tornadoes import ESConnection

class MainHandler(RequestHandler):
    def get(self):
        yield self.application.es.search('something')


class MyApp(Application):

    def __init__(self, *args, **kwargs):
        super(MyApp, self).__init__(*args, **kwargs)

        self.es = ESconnection()

if __name__ == "__main__":
    application = MyApp([
        (r"/", MainHandler),
    ])
    application.listen(8888)
    tornado.ioloop.IOLoop.current().start()
subprocess1 
           \  (http, zmq, ...)
            \            
              > pooler (some queue and tornadoes api) - http -> elastisearch
            /
           /
subprocess2