2017-04-08 3 views
6

Je vais décomposer un projet en petits microservices.Utiliser le céleri pour construire des microservices

Tous les microservices sont à base de cron. Je pense au céleri comme une distribution de tâches ainsi qu'un mécanisme pour exécuter des tâches périodiques (céleri).

Je ne veux pas construire plusieurs applications de céleri par microservice, car cela va augmenter les frais généraux d'avoir plusieurs courtiers et plusieurs systèmes de fleurs à utiliser pour la surveillance.

J'ai essayé avec une seule application sur plusieurs serveurs, mais j'ai échoué. Mes besoins avec le céleri sont:

  1. je dois avoir des serveurs indépendants pour chaque Microservice
  2. Tâche appartenant à certains Microservice devraient exécuter uniquement sur leurs serveurs; pas de partage de tâche entre les autres serveurs
  3. Dans le cas où le service microservice est arrêté, je ne veux pas que celerybeat obstrue le courtier avec des milliers de tâches en attente, ce qui entraîne un arrêt du service dans d'autres microservices.
  4. N'ont pas besoin de communication entre les microservices.

J'ai essayé la séparation des files d'attente par travailleur qui ne semble pas être possible j'ai essayé un travailleur par serveur mais j'ai besoin plus d'un travailleur sur par microservices

Répondre

4

Pour votre cas d'utilisation, d'une simple queue basée le routage d'un courtier unique devrait suffire. Ne conservez qu'un seul courtier en cours d'exécution sur un serveur ou sur un serveur distinct.

Maintenant, lors de la mise en file d'attente des tâches, ajoutez-les dans des files d'attente distinctes.

De micro service 1:

In [2]: add.apply_async(args=(12, 1), queue='queue1') 
Out[2]: <AsyncResult: 2fa5ca61-47bc-4c2c-be04-e44cbce7680a> 

Démarrer un travailleur à ne consommer que cette file d'attente

celery worker -A tasks -l info -Q queue1 

De micro service 2:

In [2]: sub.apply_async(args=(12, 1), queue='queue2') 
Out[3]: <AsyncResult: 4d42861c-737e-4b73-bfa8-6d1e86241d57> 

Démarrer un travailleur à ne consommer que ce file d'attente

celery worker -A tasks -l info -Q queue2 

Ceci s'assurera que les tâches d'un microservice seront exécutées par le travailleur uniquement à partir de ce microservice.

+0

Merci pour votre réponse. Mais cette approche crée des problèmes lors de la mise à l'échelle. Pendant que vous additionnez des tâches jusqu'à 5000 ou plus par 15 minutes et que les tâches sont intensives, les tâches seront bloquées. La surveillance du système au niveau de la file d'attente n'est également pas trop facile. –

+2

Peut expliquer le problème en détail? Si les tâches prennent du temps et si un trop grand nombre de tâches sont mises en file d'attente, la mise à l'échelle des employés devrait fonctionner correctement. Pour quoi surveillez-vous? – ChillarAnand

+0

@RakeshBhatt Vous pouvez utiliser l'option autoscale pour mettre à l'échelle les travailleurs lorsqu'il y a trop de tâches à traiter et que vous devez les compléter plus rapidement 'célery worker -l info -A t -autoscale = 8,1'. Vous pouvez également redimensionner horizontalement vos serveurs de céleri pour les consommer plus rapidement. – ChillarAnand