đȘđŠSidekiq et les signaux, tout savoir et Ă©viter les problĂšmes
(Temps de lecture : 5 minutes)
Dans une précédente newsletter, Ismaël vous expliquait que Sidekiq était trÚs utile pour décharger le serveur applicatif de toutes les tùches qui ne nécessitent pas de retour immédiat à l'utilisateur (envoi de mail, changement d'état, traitement de hooks, etc...).
L'utilisation d'un outil comme Sidekiq, de maniĂšre aussi massive et centrale dans nos apps nous oblige Ă bien connaĂźtre son fonctionnement.
Aujourd'hui, nous allons faire un focus sur les âsignauxâ, comment Sidekiq les interprĂšte et je vous prĂ©senterai un cas pouvant provoquer des erreurs trĂšs (trĂšs trĂšs comme l'Ăąne trotro) problĂ©matiques et comment l'Ă©viter.
Au programme aujourdâhui :
Temps de lecture : 5 minutes
Hello les petits Biscuits !
Bienvenue sur la 19Úme édition de Ruby Biscuit.
Vous ĂȘtes maintenant 445 abonnĂ©s đ„ł
Voici 2 annonces qui pourraient vous intĂ©resser pour rentabiliser votre 22 mars đ :
Le Wagon Paris organise un salon du recrutement qui aura lieu dans deux semaines, le vendredi 22 mars. Si vous ĂȘtes recruteur, Ă la recherche de profils tech (dev junior, data et product) pour agrandir vos Ă©quipes vous pouvez vous y inscrire ici !
React Paris : La Conférence Incontournable sur les derniÚres avancées de React ! Assistez à la conférence sur React Paris, un événement incontournable sur Paris et en ligne le 22 mars prochain ! Au programme : les toutes derniÚres avancées de l'écosystÚme React avec des présentations captivantes sur les React Server Components, l'intelligence artificielle, l'accessibilité, le design, les performances, Remix, TypeScript, et bien plus encore ! Ne manquez pas cette opportunité d'apprendre et d'échanger avec des experts, des auteurs et des membres clés de l'équipe, ainsi qu'une communauté dynamique de développeurs. Vous pouvez réservez votre place pour cette journée exceptionnelle sur https://react.paris !
Avant de vous laisser entre les mains de Quentin pour lâarticle du mois, je tenais Ă vous rappeler que vous ĂȘtes tous les bienvenus pour donner votre avis en commentaire et partager vos expĂ©riences sur les sujets que nous abordons. Vous pouvez aussi mettre un petit like â€ïž et/ou partager la newsletter Ă un copain ou une copine ! đ
Bonne lecture.
Sidekiq et les signaux, tout savoir et éviter les problÚmes
Commençons par un petit glossaire pour partir ensemble sur de bonnes bases :
Ici je me contente de reprendre des définitions d'internet ainsi que les liens pour aller plus loin.
Signal : Forme de communication entre processus utilisé par les systÚmes de type Unix et ceux respectant les standards POSIX. Il s'agit d'une notification asynchrone envoyée à un processus pour lui signaler l'apparition d'un événement
TL;DR Ctrl-c dans le terminal execute le signal SIGINT sur votre programme
https://fr.wikipedia.org/wiki/Signal_(informatique)
Graceful stop : MĂ©thode d'arrĂȘt d'un programme permettant au dit programme d'effectuer les tĂąches en cours sans en accepter de nouvelles
Idempotence : signifie qu'une opĂ©ration a le mĂȘme effet qu'on l'applique une ou plusieurs fois
https://fr.wikipedia.org/wiki/Idempotence
Sidekiq et les signaux
Sidekiq est un processus indépendant de votre serveur rails. Il est lancé généralement avec la commande
bundle exec sidekiq -C config/sidekiq.yml # + des options si besoin
Afin d'avoir une gestion fine de son fonctionnement, Sidekiq implémente certains signaux pour permettre le gracefull stop
.
La liste dĂ©taillĂ©e se trouve ici et aujourdâhui nous allons nous intĂ©resser plus particuliĂšrement Ă TSTP
et TERM
. Sidekiq implémente également le signal TTIN
mais il n'est utile que pour du debug.
TSTP :
Signal qui ordonne à Sidekiq de ne plus accepter aucun job. Vos jobs resteront donc dans la queue Redis en attendant qu'un nouveau processus soit démarré. Le processus Sidekiq sera lui marqué comme étant quiet
.
TERM :
Signal qui ordonne Ă Sidekiq de s'arrĂȘter sous un certain dĂ©lai (25 secondes par dĂ©faut, configurable avec l'option -t
). Sous le manteau cette action entraßne immédiatement le passage du processus en quiet
tout comme le fait le signal TSTP
.
PassĂ© le dĂ©lai, tout job non terminĂ© sera arrĂȘtĂ© immĂ©diatement quelque soit l'action en cours et c'est lĂ que les problĂšmes peuvent arriver đ± .
Le danger, je me ris du danger đŠ
L'idéal est d'avoir des jobs courts et idempotent et c'est aussi ce que Sidekiq recommande dans ses bonnes pratiques.
Dans le cas d'un job qu'on ne voudrait pas découper, il est important de connaßtre les limites et les moyens de se protéger.
Exemple d'un job en danger
Parce qu'un exemple vaut 1000 explications, effectuez les étapes suivantes :
Copiez le code du job ci dessous dans le dossier adéquat de votre application
Lancez dans votre terminal
bundle exec sidekiq -C config/sidekiq.yml -t
Dans la console rails de votre application, faites :
LongRunningNotSafeJob.perform_async
Dans la fenĂȘtre ou s'Ă©xecute sidekiq, faites
Ctrl-c
Observez le résultat
RĂ©pĂ©tez l'opĂ©ration plusieurs fois et voyez ou le programme s'arrĂȘte. Normalement ce n'est jamais au mĂȘme endroit.
# app/jobs/long_running_not_safe_job.rb
class LongRunningNotSafeJob
include Sidekiq::Job
def perform(init_index=1)
puts "I am entering in a long running worker"
(init_index..20).each do |i|
puts "Doing a payment for index #{i}"
sleep(1)
puts "Saving payment for index #{i} in a database record"
end
puts "I am exiting from a long running worker"
end
end
Ă chaque fois que Sidekiq s'arrĂȘtera, il remettra ce job dans la queue qui reprendra Ă 1.
Pour prendre un exemple de la vraie vie qui pourrait poser problĂšme, prenons le cas d'un call API sur une resource create
. Je demande Ă mon API foo
de me créer une ressource bar
. Une fois l'opération réussie, l'API doit me retourner l'ID de foo
que je stocke pour pouvoir travailler dessus par la suite. Si mon job Sidekiq s'arrĂȘte juste aprĂšs l'appel API mais avant que j'ai enregistrĂ© l'ID, je me retrouve avec un foo
fantÎme qui hantera mon application lorsque je devrai faire du débogage.
Cela peut vite s'avérer trÚs sensible lorsque l'on parle d'opérations de paiements.
Comment éviter cela
Respecter les bonnes pratiques de Sidekiq âŹïž
ProtĂ©ger les jobs longs en ayant en tĂȘte qu'ils peuvent s'arrĂȘter Ă tout moment aprĂšs un dĂ©lai de 25 secondes. Dans l'exemple ci dessous aprĂšs chaque tour de boucle, le job va vĂ©rifier s'il y a un processus Sidekiq ayant reçu l'ordre de s'arrĂȘter (
quiet
) et que le job est en train d'ĂȘtre exĂ©cutĂ© par ce processus. Si c'est le cas, le job va se renvoyer dans la queue - avec un paramĂštre lui permettant de reprendre lĂ oĂč il en Ă©tait - et sortir de la boucle Ă l'aide dubreak
. Ainsi, lorsqu'un nouveau processus sera allumé, le job recommencera son travail.
# app/jobs/long_running_safe_job.rb
class LongRunningSafeJob
include Sidekiq::Job
def perform(init_index=20)
puts "I am entering in a long running worker"
(init_index..20).each do |i|
puts "Doing a payment for index #{i}"
sleep(1)
puts "Saving payment for index #{i} in a database record"
# Sidekiq let 25 seconds to finish running workers when it receive a signal to stop or restart
# Quitting here when then process is quiet avoids losing important informations during the loop.
if Sidekiq::ProcessSet.new.any? { |p| p["pid"] == Process.pid && p["quiet"] == "true" }
puts "SidekiqProcess is terminating. Gracefully exiting ..."
# Reschedule job so it can be reruned safely later
LongRunningSafeWorker.perform_async(i + 1)
break
end
end
puts "I am exiting from a long running worker"
end
end
Maintenant que vous ĂȘtes prĂ©venus, soyez vigilants aux signaux đ
Pour aller plus loin, voici un article trÚs bien fait - publié également dans le Ruby Weekly de cette semaine - qui explique en profondeur le fonctionnement de Sidekiq : https://www.mikeperham.com/how-sidekiq-works/
And thanks for the fish
â Quentin
Lâagence de recrutement pour les leads dĂ©vs RoR !
Comme vous le savez, derriĂšre Ruby Biscuit, il y a Capsens đ , nous sommes une agence web qui fait du Ruby on Rails depuis 10 ans.
Avec le temps on s'est rendu compte que beaucoup de dĂ©vs choisissent leur entreprise un peu par hasard alors qu'ils pourraient davantage s'Ă©panouir et se valoriser dans des structures qui leur correspondent mieux. De plus on sait Ă quel point les process de recrutement peuvent ne pas ĂȘtre adaptĂ©s Ă notre mĂ©tier et nos profils.
Ce qui tombe super bien c'est que chez Capsens nous avons une excellente connaissance de l'écosystÚme RoR en France, avec un réseau d'entreprises considérable. La plupart étant des boites bien installées (+ de 5 ans), avec des équipes tech déjà présentes et qui recherchent avant tout des leads dévs et dévs séniors.
C'est pourquoi nous avons dĂ©cidĂ© de mettre Ă profit nos ressources pour vous aider Ă trouver le poste de vos rĂȘves !
Alors tu as plusieurs annĂ©es dâexpĂ©riences ? Tu souhaites trouver le prochain poste de lead dĂ©v de tes rĂȘves ?
ConcrĂštement voilĂ ce qui va se passer :
Réponds à cette newsletter en te présentant en deux lignes !
Je tâenvoie aussitĂŽt notre test technique pour Ă©valuer ta sĂ©nioritĂ©
Je te propose des crĂ©neaux pour un appel afin de faire ta connaissance et que tu me dises ce que tu cherches pour tâĂ©panouir dans une entreprise.
Je te propose 3 entreprises qui correspondent Ă ton profil et tes aspirations. Pour chacune de ces entreprises :
Je me charge de te donner un max dâinfos et rĂ©pondre Ă toutes tes questions par message (horaires, ambiance, taille et sĂ©nioritĂ© de lâĂ©quipe, responsabilitĂ©s, marge de manĆuvre pour la nĂ©gociation du salaire, localisation des bureaux, politique de tĂ©lĂ©travail, etc). Pas dâappels inutiles.
Avant de rencontrer le recruteur lui-mĂȘme, je te mets en relation avec un dĂ©veloppeur de leur Ă©quipe. Tu pourras alors te faire une idĂ©e de comment ça se passe de lâintĂ©rieur.
Enfin, le recruteur te recevra ! Il aura dĂ©jĂ eu toutes les informations que je lui aurai transmises sur toi ce qui vous permettra dâaller Ă lâessentiel !
Lance-toi, on attend ton e-mail ! Et si tu aimes dĂ©jĂ ton travail, ne nous contacte surtout pas ! Ou alors fais-le pour nous recommander ta boĂźte đ
Mélanie
đ€žđ»ââïž