2014-11-18 3 views
14

Я работаю над сельдереем и использую сервер rabbitmq и создал проект в проекте django на сервере (где очередь сообщений, база данных существует), и она работает нормально, я создал несколько рабочие такжеКак настроить и запустить работника сельдерея на удаленной системе

from kombu import Exchange, Queue 
CELERY_CONCURRENCY = 8 

CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml'] 

CELERY_RESULT_BACKEND = 'amqp' 
CELERYD_HIJACK_ROOT_LOGGER = True 
CELERY_HIJACK_ROOT_LOGGER = True 
BROKER_URL = 'amqp://guest:[email protected]:5672//' 

CELERY_QUEUES = (
    Queue('default', Exchange('default'), routing_key='default'), 
    Queue('q1', Exchange('A'), routing_key='routingKey1'), 
    Queue('q2', Exchange('B'), routing_key='routingKey2'), 
) 
CELERY_ROUTES = { 
'my_taskA': {'queue': 'q1', 'routing_key': 'routingKey1'}, 
'my_taskB': {'queue': 'q2', 'routing_key': 'routingKey2'}, 
} 


AMQP_SERVER = "127.0.0.1" 
AMQP_PORT = 5672 
AMQP_USER = "guest" 
AMQP_PASSWORD = "guest" 
AMQP_VHOST = "/"` 


CELERY_INCLUDE = ('functions') 

`

, но я хочу, чтобы запустить рабочих из другого server.so Мне нужна информация о том, как запустить рабочий в другой системе, когда я упомянул несколько сайтов, он говорит, что нам нужно запустить проект django на удаленной системе также необходимо?

ответ

0

Если вы хотите, чтобы ваши работники сельдерея работали на другом сервере, но все еще работали с проектом django, вам определенно придется иметь проект django на другом сервере. Если работники сельдерея на удаленном сервере отвечают только за небольшую задачу (т. Е. Одно приложение django), вы можете просто уйти от этого, но им все равно потребуется доступ к любым ресурсам, исходному коду и данным, которые они нужно выполнить работу.
Действительно, если вы хотите, чтобы два сервера работали над одними и теми же задачами, вам нужно будет использовать простой веб-интерфейс (например, Flask) для связи между серверами (и расширения функциональности вашей очереди). Затем вам нужно будет убедиться, что они оба используют один и тот же источник данных.
Рассмотрите возможность размещения базы данных удаленно или удаленный доступ к базе данных удаленно. В любом случае, любые работники, работающие на сервере , получат доступ к базе данных и весь исходный код, необходимый для выполнения задачи. Затем просто нужно, чтобы два сервера совместно использовали очередь сообщений.

+0

спасибо за ответ, он очень полезен для меня, мог бы помочь мне настроить рабочего на удаленном месте и нужно ли иметь флягу на удаленном и основном сервере – krishna

24

Вот суть идеи:

На компьютере A:

  1. Установите сельдерей & RabbitMQ.
  2. Настройте кролик, чтобы машина B могла подключиться к нему.
  3. Создайте my_tasks.py с некоторыми задачами и поставите некоторые задачи в очередь.

На компьютере B:

  1. Установите сельдерей.
  2. Скопируйте файл my_tasks.py с машины A на этот компьютер.
  3. Запуск рабочего потреблять задачи

У меня было такое же требование и экспериментировал с сельдереем. Это намного легче сделать. Несколько дней назад я написал подробное сообщение в блоге. Проверьте how to send tasks to remote machine?

+0

я следил за созданной документацией файла как показано на рисунке, но во время работы работника сельдерея он дает следующую ошибку: ------------- потребитель: не удается подключиться к amqp: // krish: **@123.456.78.9: 5672/321.654.5.111: [Errno 113] Нет маршрута к хосту. Попытка снова через 6.00 секунд ... – krishna

+1

выглядит как проблема с соединением с rabbitmq. попробуйте запустить рабочего на другой машине с той же конфигурацией и посмотреть, работает ли он. – ChillarAnand

+0

Я пробовал то же самое в другой системе, но он также поднимает одну и ту же проблему. – krishna

6

Вы можете использовать app.send_task() с чем-то вроде следующего в вашем Джанго проекте:

from celery import Celery 
import my_client_config_module 

app = Celery() 
app.config_from_object(my_client_config_module) 

app.send_task('dotted.path.to.function.on.remote.server.relative.to.worker', 
       args=(1, 2)) 
+0

Как использовать 'send_task' в случае' подзадачи'? 'app.send_task ('myapp.send_push_notification', (json.dumps (payload1),), link = app.send_task ('differentapp.save_pn_response', (json.dumps (payload2),)))' – Hussain

0

в основном я буду принимать ответ ChillarAnand в. Я хотел бы добавить комментарий к его ответу, но не могу, потому что у меня нет 50 репутации.

so ...

ответ на ваш вопрос ...

Сначала вы хотели бы прочитать "how to send tasks to remote machine?" как ChillarAnand упоминается.

Это действительно хорошая статья с одним небольшим недостатком, например «не имеет» @ app.task »в функции def add(), в содержимом remote.py», это вызвало проблему и смутило меня как новичок в сельдерей.

И ответ «[Errno 113] Нет маршрута для размещения». часть,

Я думаю ... у вас есть брандмауэр, работающий на вашем сервере rabbitmq, , возможно, вы захотите получить чек. В большинстве случаев это iptables, но это может быть что-то еще. Выключите его или измените правила. Затем вы можете попробовать еще раз.

1

Во-первых, подумайте о том, как сельдерей действительно работает?

Производитель сельдерея добавляет задачу в очередь с именем и другими важными заголовками для определения местоположения вашей задачи.

Сельдерей не добавляет в MQ полную исполняемую функцию.

Итак, когда вы смотрите на рабочую сторону (потребителя).

Сельдерей получает детали задания от MQ и пытается запустить это. Для выполнения этой задачи для выполнения этой задачи должен быть доступен модуль/файлы/среда/код.

Теперь давайте прийти на ваш вопрос ...

Вы пытаетесь установить рабочий на отдельном компьютере, так что логично для выполнения функции, на который указывает задачу вам необходимо полное кода среды задач и необходимо подключить (В противном случае, как вы получите задания от MQ?) с вашим MQ, где живут задачи.

Смежные вопросы