Как разместить задачу в очереди 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? Пожалуйста, помогите.

Author: Hussain, 2013-12-18

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.

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

 4
Author: ghopst, 2013-12-26 11:45:36