3

複数のリクエストで MongoDB 接続を共有したいと考えています。これは私が今持っているものですが、リクエストごとに新しい接続を作成しているようです。

dbasync = asyncmongo.Client(pool_id='mydb', host='127.0.0.1', port=27017, maxcached=10, maxconnections=50, dbname='bench')

@route('/readAsync')
class ReadAllAsynchHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):        
        print("getting sessions")
        dbasync["ss"].find({}, callback=self._on_response)

    def _on_response(self, response, error):
        print("on response: %s" % response)
        if error:
            raise tornado.web.HTTPError(500)
        self.finish(SS_TEMPLATE.generate(sessions=response))

1000 の同時クライアントでベンチマークを実行すると、次のエラーが発生します。

Traceback (most recent call last):
  File "/home/ubuntu/envs/myproj/local/lib/python2.7/site-packages/tornado/web.py", line 1115, in _stack_context_handle_exception
    raise_exc_info((type, value, traceback))
  File "/home/ubuntu/envs/myproj/local/lib/python2.7/site-packages/tornado/web.py", line 1298, in wrapper
    result = method(self, *args, **kwargs)
  File "bench.py", line 29, in get
    dbasync["ss"].find({}, callback=self._on_response)
  File "/home/ubuntu/envs/myproj/local/lib/python2.7/site-packages/asyncmongo/cursor.py", line 380, in find
    connection = self.__pool.connection()
  File "/home/ubuntu/envs/myproj/local/lib/python2.7/site-packages/asyncmongo/pool.py", line 116, in connection
    raise TooManyConnections("%d connections are already equal to the max: %d" % (self._connections, self._maxconnections))
TooManyConnections: 50 connections are already equal to the max: 50

DEBUG:root:dropping connection. connection pool (10) is full. maxcached 10
4

1 に答える 1

0

このmaxconnectionsパラメータは、既存の接続プールで再利用されるリクエストをバッファリングする機能はありません。むしろ、必要に応じて、アプリケーションが無制限にリソースを消費しないようにするために存在します。この動作の詳細については、https://github.com/bitly/asyncmongo/pull/45を参照してください。このプル リクエストは、希望する動作を提供するようです。次のようなものを使用して、彼のリビジョンで asyncmongo をインストールできます。

pip install git+git://github.com/ceymard/asyncmongo.git@7a8e6f6f446d71f8fd4f17de48994c0b6bee72ee

または、アプリケーションへの同時接続数を Tornado 設定のどこかで制限するか、nginx などを介して制限できる場合があります (HttpLimitConnModule を参照)。

于 2013-09-23T17:20:24.027 に答える