Pour le meilleur ou pour le pire, nous avons migré l'ensemble de notre application Web LAMP des machines dédiées vers le cloud (machines Amazon EC2). Cela va très bien jusqu'à présent, mais la façon dont nous faisons des crons est sous-optimale. J'ai une question spécifique à Amazon sur la meilleure façon de gérer les tâches cron dans le cloud en utilisant «la manière Amazon».
Le problème : nous avons plusieurs serveurs Web et devons exécuter des crons pour des tâches par lots telles que la création de flux RSS, le déclenchement d'e-mails, de nombreuses choses différentes en fait. MAIS les travaux cron ne doivent être exécutés que sur une seule machine car ils écrivent souvent dans la base de données et dupliquent donc les résultats s'ils sont exécutés sur plusieurs machines.
Jusqu'à présent, nous avons désigné l'un des serveurs Web comme le "serveur Web principal" et il a quelques tâches "spéciales" que les autres serveurs Web n'ont pas. Le compromis pour le cloud computing est la fiabilité - nous ne voulons pas d'un «serveur Web maître» car c'est un point de défaillance unique. Nous voulons qu'ils soient tous identiques et qu'ils puissent être mis à l'échelle et à la baisse sans se souvenir de ne pas retirer le serveur Web maître du cluster.
Comment pouvons-nous repenser notre application pour convertir les tâches cron Linux en éléments de travail transitoires qui n'ont pas de point de défaillance unique?
Mes idées jusqu'à présent:
- Avoir une machine dédiée à l'exécution de crons uniquement. Ce serait un peu plus gérable mais resterait un point de défaillance unique et gaspillerait de l'argent avec une instance supplémentaire.
- Certains travaux pourraient éventuellement être déplacés des crons Linux vers MySQL Events, mais je ne suis pas un grand fan de cette idée car je ne veux pas mettre la logique d'application dans la couche de base de données.
- Peut-être pouvons-nous exécuter tous les crons sur toutes les machines mais changer nos scripts cron pour qu'ils commencent tous avec un peu de logique qui implémente un mécanisme de verrouillage afin qu'un seul serveur agisse réellement et les autres sautent. Je ne suis pas fan de cette idée car elle semble potentiellement boguée et je préférerais utiliser une meilleure pratique d'Amazon plutôt que la nôtre.
- J'imagine une situation où les travaux sont planifiés quelque part, ajoutés à une file d'attente et les serveurs Web pourraient alors être chacun un travailleur, qui peut dire "hé, je vais prendre celui-ci". Amazon Simple Workflow Service sonne exactement ce genre de chose, mais je ne sais pas grand chose à ce sujet actuellement, donc des détails seraient utiles. Cela semble assez lourd pour quelque chose d'aussi simple qu'un cron? Est-ce le bon service ou existe-t-il un service Amazon plus adapté?
Mise à jour: depuis que j'ai posé la question, j'ai regardé le webinaire d' Amazon Simple Workflow Service sur YouTube et remarqué à 34:40 ( http://www.youtube.com/watch?v=lBUQiek8Jqk#t=34m40s ), j'ai aperçu un diapositive mentionnant les tâches cron comme exemple d'application. Dans leur page de documentation, " Exemples AWS Flow Framework pour Amazon SWF ", Amazon déclare avoir un exemple de code pour les crons:
... > Tâches Cron Dans cet exemple, un workflow de longue durée exécute périodiquement une activité. La possibilité de continuer les exécutions en tant que nouvelles exécutions afin qu'une exécution puisse s'exécuter pendant de très longues périodes est démontrée. ...
J'ai téléchargé le kit SDK AWS pour Java ( http://aws.amazon.com/sdkforjava/ ) et bien sûr, enfoui dans des couches ridicules de dossiers, il y a du code java ( aws-java-sdk-1.3.6/samples/AwsFlowFramework/src/com/amazonaws/services/simpleworkflow/flow/examples/periodicworkflow
).
Le problème est que, si je suis honnête, cela n'aide pas vraiment car ce n'est pas quelque chose que je peux facilement digérer avec mes compétences. Le même exemple est absent du SDK PHP et il ne semble pas y avoir de didacticiel expliquant le processus. Donc, fondamentalement, je cherche toujours des conseils ou des astuces.