Celery + SQS-使用“ queue_name_prefix”写入错误的队列

时间:2019-07-16 18:42:17

标签: celery

我正在尝试使用SQS作为代理来设置Celery任务。我可以使用以下功能(最低可复制性)使其工作:

from celery import Celery

app = Celery('tasks', broker=f'sqs://{aws_access}:{aws_secret}@')

@app.task
def test(s):
  print(s)

我运行此celery -A tasks worker --loglevel=INFO,然后通过以下命令从shell调用它:

from tasks import test
test.delay('printme')

这很好。问题是,我想在多个环境中运行它,所以我想为每个环境指定一个单独的队列。我找到了queue_name_prefix的文档,看起来像我想要的文档,但是我无法使其正常工作。

我尝试过的事情:

首先,我这样添加了一个config.py文件:

broker_transport_options = {
  'queue_name_prefix': 'dev-',
  'region': 'us-east-1'
}

并运行celery -A tasks worker --loglevel=INFO --config=config

这会在aws上创建一个dev-celery队列,但是当我尝试test.delay('printme')时,它不会执行。

然后我注意到,如果我回去去跑芹菜而没有--config标志,它就跑了我的测试任务。我检查并确认task_id匹配,因此,即使我正在运行芹菜来从dev-celery队列中 read 读取,我仍然 writing < / em>到celery队列。

我还尝试使用app.conf.update来更新代码中的celery应用,但似乎无法正常工作。

如何将预定的作业放在dev-celery队列中?

1 个答案:

答案 0 :(得分:0)

所以我确实做到了这一点,尽管我不知道这是否是最佳方法。问题似乎是,即使工作人员正在侦听“ dev-celery”队列,该任务仍被发送到默认的“ celery”队列。这是我最终使它起作用的方式:

tasks.py代码中,我向conf.update添加了呼叫:

app = Celery('tasks')
app.config.update({
    'broker_url': f'sqs://{aws_access}:{aws_secret}@',
    'task_routes': {
        'test': {'queue': 'dev-celery'}
    }
})

,然后在将任务发送到队列时,使用apply_async方法显式声明要使用的队列:

test.apply_async(
    args=['print test'],
    queue='dev-celery'
)

希望能对某人有所帮助;)