У меня есть различные очереди Кролика каждый из которых посвящена особого вида обработки заказа:Можно ли использовать пользовательские маршруты для примитивов сельдерея?
# tasks.py
@celery.task
def process_order_for_product_x(order_id):
pass # elided ...
@celery.task
def process_order_for_product_y(order_id):
pass # elided ...
# settings.py
CELERY_QUEUES = {
"black_hole": {
"binding_key": "black_hole",
"queue_arguments": {"x-ha-policy": "all"}
},
"product_x": {
"binding_key": "product_x",
"queue_arguments": {"x-ha-policy": "all"}
},
"product_y": {
"binding_key": "product_y",
"queue_arguments": {"x-ha-policy": "all"}
},
Мы имеем политику применения явной маршрутизации путем установки CELERY_DEFAULT_QUEUE = 'black_hole'
, а затем никогда не потребляя от black_hole
.
Каждая из этих задач можно использовать холст примитивов сельдерей, как и так:
# tasks.py
@celery.task
def process_order_for_product_x(order_id):
# These can run in parallel
stage_1_group = group(do_something.si(order_id),
do_something_else.si(order_id))
# These can run in parallel
another_group = group(do_something_at_end.si(order_id),
do_something_else_at_end.si(order_id))
# These run in a linear sequence
process_task = chain(
stage_1_group,
do_something_dependent_on_stage_1.si(order_id),
another_group)
process_task.apply_async()
Предположив Я хочу конкретные виды использования celery.group
, celery.chord
, celery.chord_unlock
и другие задачи, холст течь через очередь для соответствующего продукта, вместо того, чтобы попасть в ловушку в black_hole
, существует ли способ вызвать каждую конкретную задачу холста с именем пользовательской задачи или настраиваемой функцией routing_key?
По причинам, в которые я не поеду, я бы предпочел не отправлять все задания celery.*
в очередь celery_canvas
, что я и делаю тем временем.