Je travaille sur une application Rails qui doit périodiquement effectuer un grand nombre d'opérations liées aux E/S. Ces opérations peuvent être effectuées de manière asynchrone. Par exemple, une fois par jour, pour chaque utilisateur, le système doit interroger Salesforce.com afin d'extraire la liste de comptes actuelle de l'utilisateur (entreprises) qu'il suit. Cela entraîne des nombres énormes (potentiellement> 100k) de petites requêtes.Exécution d'un grand nombre d'opérations asynchrones liées aux E/S dans Rails
Notre approche actuelle consiste à utiliser ActiveMQ avec ActiveMessaging. Chacun de nos utilisateurs est placé dans une file d'attente sous la forme d'un message différent. Ensuite, le consommateur extrait l'utilisateur de la file d'attente, interroge Salesforce.com et traite les résultats. Mais cette approche nous donne une performance horrible. Dans un processus de polling unique, nous ne pouvons traiter qu'un seul utilisateur à la fois. Ainsi, les requêtes Salesforce.com sont sérialisées. À moins d'exécuter littéralement des centaines de processus d'interrogation, nous ne pouvons pas arriver à saturer le serveur en cours d'exécution.
Nous examinons EventMachine comme alternative. Il a l'avantage de nous permettre de lancer simultanément un grand nombre de requêtes Salesforce.com dans un seul processus EventMachine. Ainsi, nous obtenons un grand parallélisme et l'utilisation de notre serveur.
Mais il y a deux problèmes avec EventMachine. 1) Nous perdons la livraison fiable des messages que nous avions avec ActiveMQ/ActiveMessaging. 2) Nous ne pouvons pas facilement redémarrer périodiquement notre EventMachine pour réduire l'impact de la croissance de la mémoire. Par exemple, avec ActiveMessaging, nous avons un travail cron qui redémarre le poller une fois par jour, ce qui peut être fait sans craindre de perdre des messages. Mais avec EventMachine, si nous recommençons le processus, nous pourrions littéralement perdre des centaines de messages en cours. La seule façon que je peux voir autour de ceci est de construire une couche de livraison de persistance/fiable sur EventMachine.
Est-ce que quelqu'un a une meilleure approche? Quel est le meilleur moyen d'exécuter de manière fiable un grand nombre d'opérations asynchrones liées aux E/S?
La solution proposée doit-elle fonctionner sur plusieurs cœurs ou boîtiers? En d'autres termes, un seul thread serait-il lié à l'unité centrale? –