Comme le suggère l'article de haut niveau sur les tâches en arrière-plan et la mise en file d'attente, vos dynos Web devront communiquer avec vos dynos de travail via un mécanisme intermédiaire (souvent une file d'attente).
Pour accomplir ce que vous semblez espérer faire, suivez cette approche générale :
- La requête Web est reçue par le dyno Web
- Web Dyno ajoute une tâche à la file d'attente
- Le dyno du travailleur reçoit le travail hors de la file d'attente
- Le dyno de travail exécute la tâche, en écrivant la progression incrémentielle dans un composant partagé
- L'interrogation côté navigateur demande l'état de la tâche à partir du dyno Web
- Web Dyno interroge le composant partagé pour connaître la progression de la tâche en arrière-plan et renvoie l'état au navigateur
- Worker Dyno termine l'exécution de la tâche et la marque comme terminée dans le composant partagé
- L'interrogation côté navigateur demande l'état de la tâche à partir du dyno Web
- Web Dyno interroge le composant partagé pour connaître la progression de la tâche en arrière-plan et renvoie l'état terminé au navigateur
En ce qui concerne l'implémentation réelle, je ne connais pas trop les meilleures bibliothèques de Node.js, mais les composants qui collent ce processus sont disponibles sur Heroku en tant que modules complémentaires.
File d'attente :AMQP est un protocole de file d'attente bien pris en charge et le module complémentaire CloudAMQP peut servir de file d'attente de messages entre votre site Web et les dynos de travail.
État partagé :vous pouvez utiliser l'un des modules complémentaires Postgres pour partager l'état d'un travail en cours de traitement ou quelque chose de plus performant comme Memcache ou Redis.
Donc, pour résumer, vous devez utiliser un composant complémentaire intermédiaire pour communiquer entre les dynos sur Heroku. Bien que cette approche implique un peu plus d'ingénierie, le résultat est une architecture correctement découplée et évolutive.