Как отправить задание на очередь celery-rabbitmq в PHP?

У меня ниже версий сельдерея и кролика, установленных -

сельдерей 3.1.6
rabbitmq 3.1.1

Я могу отправить задание в очередь по умолчанию из PHP -

//client.php
<?php
require 'celery-php/celery.php';
$c = new Celery('localhost', 'guest', 'guest', '/');
$result = $c->PostTask('tasks.add', array(2,2));

Мой рабочий модуль находится в python -

# tasks.py
from celery import Celery
celery = Celery('tasks', broker='amqp://guest:[email protected]:5672//')
@celery.task(queue='demo', name='add')
def add(x, y):
    return x + y

Я запускаю работника и клиента сельдерей таким образом -

# terminal window 1
$ celery -A tasks worker --loglevel=info
# terminal window 2
$ php -f client.php

Это работает. Я вижу ниже вывод в окне терминала 1:

Received task: tasks.add[php_52b1759141a8b3.43107845]
Task tasks.add[php_52b1759141a8b3.43107845] succeeded in 0.000701383920386s: 4

Но я хочу иметь разные очереди. Для демонстрации предположим, что мне нужна только одна очередь под названием demo. Итак, я запускаю своего работника по сельдеру, как это -

$ celery -A tasks worker --loglevel=info -Q demo

Но он не работает. Задача не выполняется. Вероятно, это связано с тем, что PHP-код отправляет задачу в очередь по умолчанию: celery (видимо, не в очереди demo).

Как разместить свою задачу в конкретной очереди в PHP? Пожалуйста, помогите.

Ответ 1

По умолчанию ваш PHP-клиент для Celery берет имя очереди как "сельдерей".

Чтобы изменить очередь для публикации, вы должны указать имя очереди при создании соединения с Celery. Итак, если вы начинаете работу с сельдерей с помощью опции "-Q demo", то ваша связь с сельдереем на PHP должна быть -

$exchange = 'demo'; 
$binding = 'demo'; 
$c = new Celery('localhost', 'guest', 'guest', '/', $exchange, $binding); 

Примечание. С параметром -Q значение exchange и routing_key совпадает с именем queue_name.

Просьба попробовать и поделиться результатами.

Об обмене и привязке:

По аналогии с Телефонными службами Exchange похож на "Телефонный оператор", единственным заданием которого является "Направить вызов ВАМ" с помощью routing_key.

Связывание - это "Ваш номер телефона", который действует как routing_key на вашем телефоне.

Примечание. Этот процесс, в котором обмен перенаправляет входящее сообщение в очередь на основе привязки (routing_key), является типом обмена DIRECT. AMQP имеет несколько других типов обменов, которые вы можете прочитать в документации AMQP.

Вы также можете ссылаться на эту страницу Сельдерея