[RUBY] Comment définir une limite de relance pour sidekiq et notifier les files d'attente mortes avec Slack

introduction

Lors de l'introduction de sidekiq qui traite les travaux de manière asynchrone, si vous souhaitez le personnaliser pour votre propre application tout en profitant de la commodité, des paramètres utiles dans de tels cas C'est résumé.

Qu'est-ce que sidekiq

sidekiq est une bibliothèque qui permet le traitement asynchrone. Lorsque vous exécutez plusieurs travaux en même temps, vous pouvez spécifier la priorité de traitement en séparant le nom de la file d'attente de chaque travail. Je pense qu'il existe des bibliothèques similaires telles que resque et delay_job. Il est facile à installer, mais il présente également des points gênants tels que réessayer la file d'attente bloquée 25 fois ou 26 fois par défaut, puis ne pas pouvoir voir le journal de la file d'attente qui s'exécutait en tant que DEAD. Il y a. Donc, dans cet article, je vais expliquer comment définir la limite supérieure sur DEAD sans réessayer lors de la levée d'une exception, puis définir le contenu de la file d'attente et lancer un message d'erreur sur slack.

environnement

Ruby 2.6.6 Rails 6.0.2 redis est requis pour sidekiq.

# On OSX
brew update
brew install redis
brew services start redis

Vérifiez le tableau de bord pour les files d'attente ayant échoué

Vous pouvez le vérifier sur le tableau de bord en ajoutant sidekiq-failures au gem, et vous pouvez même réessayer toutes les files d'attente ayant échoué.

gem 'sidekiq-failures'

image.png

Vous pouvez également vérifier les détails de l'erreur dans la liste des échecs. image.png

Il semble qu'il existe de nombreux autres joyaux tels que la connaissance et l'analyse de la file d'attente lancée, je vais donc la publier pour référence.

Définir la limite supérieure des tentatives

Je pense que sidekiq avait une spécification qui tue la file d'attente après avoir réessayé environ 25 ou 6 fois par défaut. Donc, pour ceux qui veulent traiter un grand nombre de tâches à la fois, je n'ai pas à réessayer autant, alors j'ai essayé plusieurs fois et m'a dit si cela échouait. Décrivez dans le fichier.

app/jobs/your_job.rb


class YourJob < ActiveJob::Base
  ...
  queue_as :default
  sidekiq_options retry: 5
  ...
end

Avec cela, la file d'attente qui a échoué 5 fois devient la file d'attente MORTE.

Notifier la mort de la file d'attente avec Slack

Slack -coming-webhooks est un joyau qui facilite les notifications Slack dans les applications Rails.

gem 'slack-incoming-webhooks'

Obtenez l'URL de la chaîne à notifier [cette page](https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook -Vérifier% E3% 81% AE% E5% 88% A9% E7% 94% A8).

Définir ce qu'il faut faire si la file d'attente meurt dans l'initialiseur (enregistrer l'URL du canal dans .env)

app/config/initializers/sidekiq.rb


Sidekiq.configure_server do |config|
  config.death_handlers << ->(job, ex) do
    slack = Slack::Incoming::Webhooks.new(ENV['SLACK_WEBHOOK_URL'])
    attachments = [{
      title: "Sidekiq failure",
      text: "ONE DEAD JOB IS FOUND:\n (#{job['args']}) \n msg(#{job['error_message']})",
      color: "#fb2489"
    }]
    slack.post "", attachments: attachments
  end
end

Les files d'attente qui sont naturellement devenues MORT seront désormais notifiées par slack. image.png

point important

--Rescure_from Exception ne réessaye pas lorsque la notification est définie Puisqu'il s'agit d'un traitement d'exception, une fois que le travail est traité et qu'une erreur se produit, il est considéré comme mort et il vous informera de la marge mais ne réessaiera pas. Si, pour une raison quelconque, il n'est pas traité et que vous souhaitez toujours qu'il soit retenté, nous vous recommandons de définir des notifications de relâchement dans config.death_handlers comme décrit ci-dessus.

Recommended Posts

Comment définir une limite de relance pour sidekiq et notifier les files d'attente mortes avec Slack
Comment définir l'adresse IP et le nom d'hôte de CentOS8
[Cas d'amélioration Java] Comment atteindre la limite de l'auto-apprentissage et au-delà
[Explication approximative] Comment séparer le fonctionnement de l'environnement de production et de l'environnement de développement avec Rails
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
Comment vérifier l'extension et la taille des fichiers téléchargés
Comment gérer différentes versions de rbenv et Ruby
Vérifiez comment définir le délai d'expiration lors de la connexion avec Spring + HikariCP + MySQL et de l'exécution de SQL
[Rails] Comment obtenir l'URL de la source de transition et la rediriger
[Swift5] Comment obtenir un tableau et un ensemble de différences entre les tableaux
[Rails] Comment introduire le kaminari avec Slim et changer le design
[Note] Comment redémarrer le conteneur Windows configuré avec docker-compose
Comment créer un retrait de deux espaces d'un octet dans l'implémentation JAXB du JDK
Comment décorer CSS sur les boutons radio de rails6 form_with (helper)
Comment accéder directement à Socket avec la fonction TCP de Spring Integration
Comment modifier le nombre maximum et maximum de données POST dans Spark
[swift5] Comment changer la couleur de TabBar ou la couleur de l'élément de TabBar avec le code
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH
Comment déterminer le nombre de parallèles
Comment configurer et utiliser kapt
[Java] Comment régler la date sur 00:00:00
Comment trier une liste de SelectItems
Comment trouver les dizaines et les unités
Comment utiliser ToolBar avec la super marge Part1 Définir les caractères et changer les couleurs
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Différence entre Java, C # et JavaScript (comment trouver le degré d'obésité)
Envoyez des notifications à Slack avec la version gratuite de sentry (en utilisant lambda)
Comment définir des variables d'environnement dans le fichier de propriétés de l'application Spring Boot
Comment configurer la vision par ordinateur pour le suivi des images et des vidéos avec TrackingJs
Comment utiliser Eclipse sur mon PC avec 32 bits et 2 Go de mémoire
Comment partager côté hôte (Windows) et côté invité (CentOS 7) avec VirtualBox
Promesse JDBC et exemple d'écriture
Comment trouver la cause de l'erreur Ruby
Personnalisez la répartition du contenu de Recyclerview
Définir l'heure de LocalDateTime à une heure spécifique
Comment obtenir le jour d'aujourd'hui
Sortie de la façon d'utiliser la méthode slice
[Java] (pour MacOS) Méthode de définition du chemin de classe
Comment configurer et utiliser jEnv (Mac)
Comment créer un serveur Jenkins avec un conteneur Docker sur CentOS 7 de VirtualBox et accéder au serveur Jenkins à partir d'un PC local
Comment créer une API avec GraphQL et Rails
Comment afficher le résultat du remplissage du formulaire
Comment trouver le score total et le score moyen
Si vous utilisez SQLite avec VSCode, utilisez l'extension (comment voir le fichier binaire de sqlite3)
Comment définir le niveau de journalisation à afficher dans la version commerciale de orhanobut / logger
Comment utiliser git avec la puissance de jgit dans un environnement sans commandes git
Comment demander en passant un tableau à une requête avec le client HTTP de Ruby
[Docker] Comment voir le contenu des volumes. Démarrez un conteneur avec les privilèges root.
Implémentons une fonction pour limiter le nombre d'accès à l'API avec SpringBoot + Redis
[Java] Comment obtenir l'URL de la source de transition
Comment changer l'action avec plusieurs boutons d'envoi
Comment régler l'heure d'affichage sur l'heure japonaise dans les rails
Comment écrire Scala du point de vue de Java
[Java] Types de commentaires et comment les rédiger
Convertit le tableau d'erreurs.full_messages en caractères et sortie