芹菜:如何用不同的工人来区分不同的环境



我需要将某个django站点实例的所有任务路由到某个队列。我的设置如下:

  • 几个运行Django项目的Web服务器(1.7)
  • 一台服务器运行芹菜工人(3.1.7)
  • 三个环境:生产、阶段和开发。每个环境都使用不同的DJANGO_SETTINGS_MODULE和不同的CELERY_DEFAULT_QUEUE设置运行
  • 一个redis实例作为broker(所有内容都在同一个数据库中)

在"芹菜服务器"上,我通过supervisor(简化的conf)运行多个工作实例:

[program:production_queue]
environment=PYTHONPATH=/pth/to/src/:/pth/to/site-packages/,DJANGO_SETTINGS_MODULE=website.settings.production
command=/pth/to/python celery -A website.celery worker --events --queues myserver --loglevel WARNING --concurrency 4 -n production@celery.myserver.nl
[program:staging_queue]
environment=PYTHONPATH=/pth/to/src/:/pth/to/site-packages/,DJANGO_SETTINGS_MODULE=website.settings.staging
command=/pth/to/python celery -A website.celery worker --events --queues myserver_staging --loglevel WARNING --concurrency 1 -n staging@celery.myserver.nl
[program:development_queue]
environment=PYTHONPATH=/pth/to/src/:/pth/to/site-packages/,DJANGO_SETTINGS_MODULE=website.settings.development
command=/pth/to/python celery -A website.celery worker --events --queues myserver_development --loglevel INFO --concurrency 1 -n development@celery.myserver.nl

这是有效的,有检查:

$ celery -A website.celery inspect activeues
-> production@celery.myserver.nl: OK
    * {u'exclusive': False, u'name': u'myserver', u'exchange': {u'name': u'celery', u'durable': True, u'delivery_mode': 2, u'passive': False, u'arguments': None, u'type': u'direct', u'auto_delete': False}, u'durable': True, u'routing_key': u'celery', u'no_ack': False, u'alias': None, u'queue_arguments': None, u'binding_arguments': None, u'bindings': [], u'auto_delete': False}
-> staging@celery.myserver.nl: OK
    * {u'exclusive': False, u'name': u'myserver_staging', u'exchange': {u'name': u'celery', u'durable': True, u'delivery_mode': 2, u'passive': False, u'arguments': None, u'type': u'direct', u'auto_delete': False}, u'durable': True, u'routing_key': u'celery', u'no_ack': False, u'alias': None, u'queue_arguments': None, u'binding_arguments': None, u'bindings': [], u'auto_delete': False}
-> development@celery.myserver.nl: OK
    * {u'exclusive': False, u'name': u'myserver_development', u'exchange': {u'name': u'celery', u'durable': True, u'delivery_mode': 2, u'passive': False, u'arguments': None, u'type': u'direct', u'auto_delete': False}, u'durable': True, u'routing_key': u'celery', u'no_ack': False, u'alias': None, u'queue_arguments': None, u'binding_arguments': None, u'bindings': [], u'auto_delete': False}

(名称符合CELERY_DEFAULT_QUEUE设置)

website/celery.py包含基础(跳过导入):

app = Celery('proj')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

因此,我希望由使用开发设置运行的Web服务器生成的任务最终只在development_queue中,依此类推。然而,我看到任务由不同的队列处理,或者由这三个队列处理,这是有问题的。

我的期望是错误的,因为这将是一个很好的方式来分离这些任务所有关于路由的文档都是关于将不同的任务路由到不同的队列的,我不需要这些。我需要将某个站点(环境)的所有任务路由到某个队列我能做些什么来分离这些环境

我从Celery的开发者那里得到了答案:https://github.com/celery/celery/issues/2508,即:

您必须设置所有CELERY_DEFAULT_QUEUECELERY_DEFAULT_EXCHANGECELERY_DEFAULT_ROUTING_KEY。否则,您将得到三个队列,所有队列都绑定到同一个交换和路由密钥。

或者使用此处的方法,该方法将显式设置它:http://docs.celeryproject.org/en/latest/userguide/routing.html#changing-默认队列的名称

真管用!

我有一个类似的设置,但我的解决方案是使用不同的RabbitMQ代理进行开发、暂存和生产。

例如,在我的个人发展设置文件中,我有:

CELERY_BROKER = "librabbitmq://user:user@my_machine.domain.com/"

在生产设置文件中,我有:

CELERY_BROKER = "librabbitmq://prop:prod@main_cluster.domain.com/"

在我的芹菜应用程序模块中,我有:

app = Celery('App', broker=settings.CELERY_BROKER)

我不知道这是否有帮助,但我在芹菜用户板上看到了你的帖子,由于你没有任何其他回复。。。

相关内容

  • 没有找到相关文章

最新更新