Redimensionner Cron: vérifier des centaines de sites par minute
Dans mon dernier article, j’a I décrit comment créer une application Cloud en utilisant laraverspark. La disponibilité du Web est une application de surveillance et de disponibilité du site Web qui surveille l’état de votre site Web chaque minute à partir de plusieurs endroits dans le monde. La création d’une telle application m’a excité et c’est un défi technique de vérifier l’état de centaines, sinon de milliers, de sites Web par minute. Dans cet article, je décrirai le processus de réflexion qui m’a conduit à trouver l’architecture dont j’avais besoin, donc je vais étudier la solution que j’ai décidé. Le processus de vérification périodique de l’état d’un site Web est simple. Définissez un processus Cron qui fonctionne toutes les minutes et activez une requête get qui renvoie l’état http du site (le site est inactif si la requête get échoue ou si un état d’erreur se produit!). Cependant, les choses deviennent plus compliquées lorsque vous commencez à penser à la façon d’effectuer le même processus chaque minute pour des centaines ou des milliers de sites.
Le temps de disponibilité du Web est construit en utilisant laraver (PHP), mais PHP n’est pas un langage de synchronisation. Par exemple, contrairement à Python ou Node, il ne supporte pas le Threading ou l’exécution simultanée de plusieurs processus. Cela signifie que vous ne pouvez pas simplement vérifier chaque site toutes les minutes et recueillir les résultats. Il y a des projets qui permettent le Threading en PHP, comme l’extension PECL pthreads, mais je ne veux rien ajouter à la complexité du serveur de maintenance. Je ne pense pas que ce soit une option viable. Que puis – je faire d’autre?
Créer un Cron distinct pour chaque site utiliser des outils comme AWS lambda pour gérer les contrôles utiliser un cadre de cluster de travail comme gearman utiliser des files d’attente avec des clusters de serveurs de travail dans ma planification initiale, j’ai décidé qu’il n’était pas facile de créer un Cron distinct pour chaque site
Même si j’exécute plusieurs auditeurs de file d’attente sur chaque serveur, des centaines de sites par minute occupent un nombre considérable de serveurs de travail dans chaque zone pour gérer la charge (la charge n’est pas la puissance de calcul ici, mais le temps nécessaire pour effectuer la vérification).
Comme chaque vérification peut prendre de 1 à 10 secondes (selon le temps de chargement du site examiné), j’ai réalisé que j’avais besoin de beaucoup de serveurs, ce qui serait très coûteux. Les coûts sont trop élevés pour les petits projets comme les temps de disponibilité du Web. Il est temps de retourner au tableau. Solution: Curl _ Multi après avoir fait plus de recherches et réalisé que j’avais besoin d’une solution de synchronisation pratique, j’ai rencontré quelque chose en PHP que je n’avais jamais vu auparavant. L’implémentation Curl de PHP a un certain nombre de fonctions (Curl _ Multi *) qui vous permettent d’envoyer plusieurs requêtes à la fois, ce qui signifie que vous pouvez envoyer des centaines de requêtes à la fois (dans des limites raisonnables) et retourner le résultat de la requête la plus longue en un seul temps.
Cela semblait idéal, donc j’ai rapidement mis en place un test pour voir si c’était aussi bon que ça en avait l’air, en fait, maintenant je peux envoyer 100 requêtes Get en 7 secondes. Cela signifie que je peux utiliser un serveur dans chaque zone (bon marché) et effectuer des centaines de contrôles en toute sécurité par minute dans un avenir proche. Ma mise en œuvre se termine ainsi: $MH = Curl _ Multi init () $ Transaction = [] $ Erreur = []; Foreach ($Monitors as $Monitor) {try {$URL = $Monitor – > Site – > URL; $port = $Monitor – > port; if ($port = = 80 & & Start _ with ($URL, ‘https’) {$port = 443;} Curl = Curl _ init (); Curl _ setopt ($Curl, curlopt URL, $URL); Curl _ setopt ($Curl, curlopt port, $port); Curl _ setopt ($Curl, curlopt timeout, 20); Curl _ setopt ($Curl, curlopt header, 1); Curl _ setopt ($ASS)
Regular _ exec j’ai besoin d’exécuter un serveur à cette vitesse tous les 100 sites (assurez – vous que je peux terminer la vérification en 60 secondes) Tout en utilisant les requêtes Curl Multi exec, et je pourrais exécuter des milliers de requêtes avant d’avoir besoin d’un autre serveur. Il s’agit d’une économie considérable pour une petite start – up.
Quelle est la prochaine étape? Bien que cette solution soit un moyen économique de réduire la taille des opérations de Cron dans un avenir proche, elle n’est pas une solution permanente. À l’heure actuelle, le temps de disponibilité du Web utilise cette technologie pour effectuer environ 7 millions de vérifications par mois, et un serveur par emplacement semble fonctionner correctement. Cependant, les ressources du serveur ne sont pas illimitées, et vous devrez ajouter plus de serveurs à l’avenir, et peut – être même avoir besoin d’une approche complètement différente pour étendre ces contrôles. À ce moment – là, il serait peut – être plus logique de se concentrer sur quelque chose comme AWS lambda. On verra bien.
Avez – vous déjà eu besoin de redimensionner Cron? Avez – vous déjà utilisé la fonction Curl _ Mutli? Avez – vous des suggestions pour zoomer? Veuillez nous le dire dans vos commentaires.