2012-03-05 11 views
0

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日の仕事の量は比較的少ないだろう)、私は知りたい!前もって感謝します。

答えて

2

私はそれはバグだと思います。セロリはkumuにserver_uriの代わりにhostnameを渡したので、この問題が発生します。コードをトレースした後、私はバグを回避するために次のconfを見つけました。

CELERY_RESULT_BACKEND = 'mongodb' 
BROKER_HOST = "subdomain.mongolab.com" 
BROKER_PORT = 123456 
BROKER_TRANSPORT = 'mongodb' 
BROKER_VHOST = 'testdb' 
CELERY_IMPORTS = ('tasks',) 
CELERY_MONGODB_BACKEND_SETTINGS = { 
     'host': 'subdomain.mongolab.com', 
     'port': 123456, 
     'database': 'testdb', 
     'user': user, 
     'password': password, 
     'taskmeta_collection': 'teskmeta' 
     } 

構成を繰り返すだけです。

1

それはあなたが「ユーザー」を削除した場合、助けCELERY_MONGODB_BACKEND_SETTINGSの辞書から「パス」、「ポート」、および「データベース」、とどうなる:

BROKER_URL = "mongodb://user:[email protected]:123456/testdb" 

CELERY_MONGODB_BACKEND_SETTINGS = { 
    "host":BROKER_URL, 
    "taskmeta_collection":"taskmeta", 
} 
+0

返信ありがとうございます...この設定でも同じ例外が発生します。 – DeaconDesperado