web-dev-qa-db-fra.com

comment configurer et exécuter le travailleur de céleri sur un système distant

je travaille sur le céleri et l’utilisation du serveur rabbitmq et j’ai créé un projet dans le projet Django sur un serveur (où la file de messages, la base de données existe) et il fonctionne bien, j’ai créé plusieurs travailleurs également. 

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:guest@localhost: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')

`

mais je veux exécuter des ouvriers à partir d’un autre serveur. Alors j’ai besoin d’informations sur la façon de faire fonctionner un ouvrier sur un autre système quand je me suis référé à quelques sites, il dit que nous devons exécuter le projet Django sur le système distant.

17
krishna

Voici l'essentiel de l'idée:

Sur la machine A:

  1. Installez Céleri & RabbitMQ.
  2. Configurez rabbitmq pour que la machine B puisse s'y connecter.
  3. Créez my_tasks.py avec certaines tâches et mettez certaines tâches en file d'attente.

Sur la machine B:

  1. Installez le céleri.
  2. Copiez le fichier my_tasks.py de la machine A vers cette machine.
  3. Exécuter un ouvrier pour consommer les tâches

J'ai eu la même exigence et expérimenté avec le céleri. C'est beaucoup plus facile de faire ça. J'ai écrit un article de blog détaillé quelques jours auparavant. Check out comment envoyer des tâches à une machine distante?

29
ChillarAnand

Vous pouvez utiliser app.send_task() avec quelque chose comme ce qui suit dans votre projet Django:

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))
7
lajarre

Tout d’abord, réfléchissez à la façon dont le céleri fonctionne vraiment?

Le producteur de céleri ajoute une tâche à la file d'attente avec le nom et d'autres en-têtes importants pour identifier l'emplacement de votre tâche.

Le céleri n’ajoute pas de fonction exécutable complète à MQ.

Donc, quand on regarde le côté travailleur (consommateur).

Le céleri obtient les détails de la tâche auprès de MQ et tente de l'exécuter . Pour exécuter cette tâche, un module/fichier/environnement/code base doit être disponible pour exécuter cette tâche.

Maintenant, venons à votre question ...

Vous essayez de définir un ouvrier sur une machine distincte afin d'exécuter logiquement une fonction pointée par la tâche; vous avez besoin d'un environnement de code complet de tâches et vous devez vous connecter (sinon, comment obtenir des tâches de MQ?) Avec votre MQ où vivent les tâches.

1
GrvTyagi

fondamentalement, je vais prendre la réponse de ChillarAnand. Je voudrais ajouter un commentaire sur sa réponse, mais je ne peux pas parce que je n’ai pas 50 ans.

alors...

la réponse à votre question ...

Vous souhaitez d’abord lire "comment envoyer des tâches à une machine distante?" , comme ChillarAnand mentionné.

C'est vraiment un bon article, avec un petit défaut, comme "n'a pas '@ app.task' sur la fonction def add (), dans le contenu remote.py", cela a posé problème et m'a confondu en tant que novice du céleri .

Et la réponse à "[Errno 113] No route to Host." partie,

Je suppose que… je suppose que vous avez un pare-feu sur votre serveur rabbitmq, vous pouvez vouloir vérifier. La plupart du temps, c'est iptables, mais cela pourrait être autre chose. Éteignez ou changez les règles. Ensuite, vous pouvez essayer à nouveau.

0
bluebird_lboro