Redis
 sql >> Base de données >  >> NoSQL >> Redis

Utilisation de Celery pour l'interrogation d'API externe synchrone en temps réel avec Gevent

Je vais essayer de répondre à autant de questions que possible.

Cela peut-il (et devrait-il) être fait avec du céleri ?

Oui, vous pouvez

J'utilise django. Dois-je essayer d'utiliser django-céleri plutôt que du céleri ordinaire ?

Django a un bon support pour le céleri et rendrait la vie beaucoup plus facile pendant le développement

Chacune de ces tâches peut engendrer d'autres tâches - telles que la journalisation de ce qui vient de se passer ou d'autres types de bifurcation. Est-ce possible ?

Vous pouvez démarrer des sous-tâches à partir d'une tâche avec ignore_result =true pour les effets secondaires uniquement

Les tâches pourraient-elles renvoyer les données qu'elles obtiennent ?

Je suggérerais de mettre les résultats dans la base de données, puis de transmettre l'identifiant, ce qui rendrait votre courtier et vos employés heureux. Moins de transfert de données/décapage, etc.

Chaque tâche est principalement liée aux E/S et devait initialement utiliser l'événement du thread Web pour répartir les requêtes et ignorer la conception de mise en file d'attente entière, mais il s'avère qu'elle serait réutilisée pour un composant différent. Essayer de garder tout le trajet aller-retour à travers les Qs en temps réel nécessitera probablement de nombreux travailleurs s'assurant que les files d'attente sont pour la plupart vides. Ou est-ce? L'exécution du pool de travail gevent vous aiderait-elle ?

Étant donné que le processus est io lié, gevent vous aidera certainement ici. Cependant, combien la simultanéité devrait être pour le travailleur gevent pool'd, c'est quelque chose que je cherche aussi une réponse.

Dois-je écrire des tâches spécifiques à gevent ou vais-je utiliser automatiquement le pool de gevent avec les E/S réseau ?

Gevent effectue automatiquement le correctif du singe lorsque vous l'utilisez en piscine. Mais les bibliothèques que vous utilisez devraient bien fonctionner avec gevent. Sinon, si vous analysez certaines données avec simplejson (qui est écrit en c), cela bloquerait d'autres greenlets gevent.

Est-il possible d'attribuer une priorité à certaines tâches ?

Vous ne pouvez pas attribuer de priorités spécifiques à certaines tâches, mais les acheminer vers une file d'attente différente, puis faire écouter ces files d'attente par un nombre variable de travailleurs. Plus il y a de travailleurs pour une file d'attente particulière, plus la priorité de ces tâches dans cette file d'attente est élevée.

Qu'en est-il de les garder en ordre ?

La chaîne est un moyen de maintenir l'ordre. L'accord est un bon moyen de résumer. Le céleri en prend soin, vous n'avez donc pas à vous en soucier. Même en utilisant gevent pool, il serait finalement possible de raisonner sur l'ordre d'exécution des tâches.

Dois-je éviter le céleri et utiliser uniquement le kombu ?

Vous pouvez, si votre cas d'utilisation ne se transforme pas en quelque chose de plus complexe au fil du temps et aussi si vous êtes prêt à gérer vous-même vos processus via celeryd + superviseurd. De plus, si vous ne vous souciez pas de la surveillance des tâches fournie avec des outils tels que le céleri-mon, la fleur, etc.

Il semble que le céleri soit plutôt orienté vers des "tâches" qui peuvent être différées et qui ne sont pas sensibles au facteur temps.

Celery prend également en charge les tâches planifiées. Si c'est ce que vous vouliez dire par cette déclaration.

Suis-je fou d'essayer de garder ce temps réel ?

Je ne pense pas. Tant que vos consommateurs sont assez rapides, ce sera aussi bon qu'en temps réel.

Quelles autres technologies devrais-je envisager ?

En ce qui concerne le céleri, vous devez choisir judicieusement le magasin de résultats. Ma suggestion serait d'utiliser Cassandra. C'est bon pour les données en temps réel (à la fois en écriture et en requête). Vous pouvez également utiliser redis ou mongodb. Ils viennent avec leur propre ensemble de problèmes en tant que magasin de résultats. Mais alors, un peu de peaufinage dans la configuration peut aller très loin.

Si vous voulez dire quelque chose de complètement différent du céleri, vous pouvez vous tourner vers asyncio (python3.5) et zeromq pour obtenir la même chose. Je ne peux pas en dire plus à ce sujet.