mongodbブローカをバックエンドとして使用してCeleryセットアップ(基本チュートリアルに続いて)を手に入れようとしています。公式ドキュメントに記載された構成のガイドラインに続いて、次のように私のceleryconfig.py
セットアップです:セロリwith MongoDB Broker
CELERY_RESULT_BACKEND = "mongodb"
BROKER_BACKEND = "mongodb"
BROKER_URL = "mongodb://user:[email protected]:123456/testdb"
CELERY_MONGODB_BACKEND_SETTINGS = {
"host":"subdomain.mongolab.com",
"port":123456,
"database":"testdb",
"taskmeta_collection":"taskmeta",
"user":"user",
"pass":"pass",
}
CELERY_IMPORTS = ("tasks",)
が--loglevel=INFO
でcelerydを実行すると、次の例外を返しますpymongoに起因なく、昆布とセロリの両方バブリング。
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/celery/worker/__init__.py", line 230, in start
component.start()
File "/usr/local/lib/python2.7/dist-packages/celery/worker/consumer.py", line 338, in start
self.reset_connection()
File "/usr/local/lib/python2.7/dist-packages/celery/worker/consumer.py", line 596, in reset_connection
on_decode_error=self.on_decode_error)
File "/usr/local/lib/python2.7/dist-packages/celery/app/amqp.py", line 335, in get_task_consumer
**kwargs)
File "/usr/local/lib/python2.7/dist-packages/kombu/compat.py", line 187, in __init__
super(ConsumerSet, self).__init__(self.backend, queues, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/kombu/messaging.py", line 285, in __init__
self.declare()
File "/usr/local/lib/python2.7/dist-packages/kombu/messaging.py", line 295, in declare
queue.declare()
File "/usr/local/lib/python2.7/dist-packages/kombu/entity.py", line 388, in declare
self.queue_declare(nowait, passive=False)
File "/usr/local/lib/python2.7/dist-packages/kombu/entity.py", line 408, in queue_declare
nowait=nowait)
File "/usr/local/lib/python2.7/dist-packages/kombu/transport/virtual/__init__.py", line 380, in queue_declare
return queue, self._size(queue), 0
File "/usr/local/lib/python2.7/dist-packages/kombu/transport/mongodb.py", line 74, in _size
return self.client.messages.find({"queue": queue}).count()
File "/usr/local/lib/python2.7/dist-packages/kombu/transport/mongodb.py", line 171, in client
self._client = self._open()
File "/usr/local/lib/python2.7/dist-packages/kombu/transport/mongodb.py", line 97, in _open
mongoconn = Connection(host=conninfo.hostname, port=conninfo.port)
File "/usr/local/lib/python2.7/dist-packages/pymongo/connection.py", line 325, in __init__
nodes.update(uri_parser.split_hosts(entity, port))
File "/usr/local/lib/python2.7/dist-packages/pymongo/uri_parser.py", line 198, in split_hosts
nodes.append(parse_host(entity, default_port))
File "/usr/local/lib/python2.7/dist-packages/pymongo/uri_parser.py", line 127, in parse_host
raise ConfigurationError("Reserved characters such as ':' must be "
ConfigurationError: Reserved characters such as ':' must be escaped according RFC 2396. An IPv6 address literal must be enclosed in '[' and ']' according to RFC 2732.
それがこのエラーを投げているpymongo
内のURIパーサーですので、セロリはmongouriを処理する方法についての何かが、正しくエンコードされていません。私は、uri文字列に:
文字をエスケープしようとしましたが、これはすべて、変換された接続文字列を持つデフォルトのAMQPにトランスポートを戻すことです。
amqp://[email protected]:5672/mongodb\http://user\:[email protected]\:29217/testdb
これは明らかに正しくありません。
コンフィグレーションでuriを生の文字列としてr
を使って入力しようとしましたが、何も変わりません。
2.4(私は2.5.1、pymongo 2.1.1を使用しています)以来、この種の接続設定がCeleryでサポートされており、公式のドキュメントはすべて、mongodbブローカへの接続方法として推奨しています。
これはバグかもしれませんが、おそらく最新のpymongoビルドとの互換性がありませんか?この方法がうまくいかない場合は、?replicaSet
パラメータを使用してmongouriに渡す必要があると仮定しているため、タスクキューをレプリカセットにどのように付加しますか。
私はRabbitMQブローカーを使用することに変わりはないことに注意してください.Mongoはすでに問題のアプリのスタックに入っており、すでにあるものを使用する方が直感的です。 Mongoがこの目的のためにあまり効果的ではない具体的な理由があるなら(1日の仕事の量は比較的少ないだろう)、私は知りたい!前もって感謝します。
返信ありがとうございます...この設定でも同じ例外が発生します。 – DeaconDesperado