Как разместить задачу в очереди celery-rabbitmq в PHP?
У меня установлены следующие версии сельдерея и rabbitmq -
Сельдерей 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:guest@localhost: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
Но я хочу, чтобы у меня были разные очереди. Для демонстрации, допустим, я хочу, чтобы была вызвана только одна очередь демонстрация. Поэтому я управляю своим работником по сельдерею вот так -
$ celery -A tasks worker --loglevel=info -Q demo
Но это не работает. Задача не выполняется. Я предполагаю, что это, вероятно, потому, что PHP-код размещает задачу в очереди по умолчанию: сельдерей (по-видимому, не в очереди демо).
Как разместить свою задачу в определенной очереди в PHP? Пожалуйста, помогите.
1 answers
По умолчанию ваш PHP-клиент для сельдерея принимает имя очереди как "сельдерей".
Чтобы изменить очередь для публикации, необходимо указать имя очереди при создании экземпляра подключения к Сельдерею. Итак, если вы начинаете свою работу с сельдереем с опцией "-Q demo", то ваше подключение к сельдерею в PHP должно быть -
$exchange = 'demo';
$binding = 'demo';
$c = new Celery('localhost', 'guest', 'guest', '/', $exchange, $binding);
Примечание: С опцией -Q значение ключа обмена и маршрутизации совпадает с именем очереди.
Пожалуйста, попробуйте это и поделитесь результаты.
Об обмене и привязке :
По аналогии с телефонными службами, Exchange подобен "Телефонному оператору", чья единственная задача - "Направить звонок ВАМ" с помощью routing_key.
Привязка - это "Ваш номер телефона", который действует как routing_key на ваш телефон.
Примечание: Этот процесс, в котором exchange перенаправляет входящее сообщение в очередь на основе привязки (routing_key), является ПРЯМЫМ типом обмена. AMQP имеет несколько других типов обменов, о которых вы можете прочитать в документации AMQP.
Вы также можете обратиться к этой странице Сельдерей