1

heroku でセロリが仲介する django プロジェクトのバックエンドとして redis を構成した経験のある方からのご意見をお待ちしております。私のタスク スケジューリングは localhost からは問題なく機能しましたが、heroku にデプロイするのは本当にイライラします。

  • 現在、3 つの dyno、1 つの Web、1 つのスケジューラー、1 つのワーカーを実行しています。
  • プロジェクトに redistogo アドオンを追加しました。Redistogo を無料の nano プランに設定すると、10 接続、1 DB、5 MB サイズのインスタンスが得られます
  • settings.py の構成については、redistogo のドキュメント ( https://devcenter.heroku.com/articles/redistogo#install-redis-in-python ) に従いましたが、別の方法として、ソリューションのバリエーションの実装も試みました。どちらも私のために働いていません。これが私がsettings.pyに持っているものです:

     redis_url = os.environ.get('REDISTOGO_URL', 'http://localhost:6959')
    
     CACHES = {
            'default': {
            'BACKEND': 'redis_cache.RedisCache',,
            'LOCATION': '%s:%s' % (redis_url.hostname, redis_url.port),
            'OPTIONS': {
                'DB': 0,   # or 1?
                'PASSWORD': redis_url.password,
                #'PARSER_CLASS': 'redis.connection.HiredisParser'
            },
        },
     }
    
    CELERY_RESULT_BACKEND = redis_url
    BROKER_URL = 'redis://localhost:6959/0'
    

アプリを実行しようとしたときのherokuログは次のとおりです。

2013-07-11T12:16:10.998516+00:00 app[web.1]:     apps = settings.INSTALLED_APPS
2013-07-11T12:16:10.998516+00:00 app[web.1]:     mod = importlib.import_module(self.SETTINGS_MODULE)
2013-07-11T12:16:10.998263+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
2013-07-11T12:16:10.998263+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 263, in fetch_command
2013-07-11T12:16:10.998516+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/conf/__init__.py", line 53, in __getattr__
2013-07-11T12:16:10.998516+00:00 app[web.1]:     self._setup(name)
2013-07-11T12:16:10.998516+00:00 app[web.1]:     self._wrapped = Settings(settings_module)
2013-07-11T12:16:10.998516+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/conf/__init__.py", line 132, in __init__
2013-07-11T12:16:10.998516+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
2013-07-11T12:16:10.998516+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in _setup
2013-07-11T12:16:10.998712+00:00 app[web.1]:     'LOCATION': '%s:%s' % (redis_url.hostname, redis_url.port),
2013-07-11T12:16:10.998712+00:00 app[web.1]: AttributeError: 'str' object has no attribute 'hostname'
2013-07-11T12:16:12.201202+00:00 heroku[web.1]: Process exited with status 1
2013-07-11T12:16:12.250743+00:00 heroku[web.1]: State changed from starting to crashed

redis_url を str ではなく URI のように扱うにはどうすればよいですか?

私のprocfile:

web: python manage.py run_gunicorn -b 0.0.0.0:$PORT -w 3 --log-level info
scheduler: python manage.py celeryd -B -E
worker: python manage.py celeryd -E -B --loglevel=INFO

要件には、django-redis-cache==0.10.0、redis==2.7.6、django-celery==3.0.17、セロリ celery==3.0.20、kombu==2.5.12 があります。

4

3 に答える 3

0

自分のソリューションにはあまり満足していませんが、redistogo のホスト名、ポート、およびパスワードをハードコーディングしたところ、すべてがスムーズに実行されるようになりました。

于 2013-07-12T19:26:33.140 に答える
0

os.environ.get文字列を返しているように見えます (またはstr? Python に慣れていない) が、URI オブジェクトまたは何かのようなものであると期待しています。通常の python 文字列は次のようなメソッドに応答しますhostnameか?

ドキュメントには次の手順もあります。

redis = redis.from_url(redis_url)

これらのドキュメントによると、文字列を解析してredisオブジェクトにします。

于 2013-07-11T13:15:19.627 に答える