Maison >base de données >Redis >Comment implémenter la planification des tâches basée sur le verrouillage distribué Redis

Comment implémenter la planification des tâches basée sur le verrouillage distribué Redis

WBOY
WBOYavant
2023-05-28 13:37:30681parcourir

Dans le processus de collecte de données distribuées à grande échelle, la gestion des sources d'informations est particulièrement importante. Afin de garantir qu'une même tâche ne peut être traitée que par un seul collecteur à la fois, l'unicité de la planification des tâches doit être garantie. Habituellement, lorsque nous effectuons une collecte de données distribuée, il y aura généralement un module de planification, dont la responsabilité principale est de répartir les tâches de collecte et de garantir l'unicité des tâches.

Parce qu'il est distribué et implique plusieurs serveurs (plusieurs machines), chaque serveur implique plusieurs collecteurs (plusieurs processus) et chaque collecteur peut impliquer plusieurs threads, donc le module de planification des tâches Le mécanisme de verrouillage est particulièrement important. Selon l'architecture d'implémentation de l'application, l'implémentation des verrous peut généralement être divisée selon les types suivants : Si le gestionnaire est monoprocessus et multithread, sous python, vous pouvez utiliser l'objet Lock du module threading pour limiter le partage. Accès synchrone aux variables pour assurer la sécurité des threads.

  • Dans le cas d'une seule machine et de plusieurs processus, sous python, vous pouvez utiliser l'objet Lock du multitraitement pour le gérer.

  • Dans le cas d'un déploiement multi-machines et multi-processus, vous devez vous appuyer sur un composant tiers (objet de verrouillage de stockage) pour mettre en œuvre un verrouillage de synchronisation distribué.

  • Étant donné que le module de planification est un mécanisme de traitement multi-machines, multi-processus et multi-thread, il est cohérent avec la troisième méthode.

Méthodes d'implémentation de verrous distribués

Les méthodes actuelles d'implémentation de verrous distribués sont les suivantes :

Basé sur une base de données, telle que mysql

  • Basé sur un cache, tel que redis

  • Implémenté basé sur sur zookeeper

  • Chaque méthode de mise en œuvre a ses propres avantages après un examen approfondi, Redis est le choix le plus approprié. La raison principale est la suivante :

redis fonctionne sur la base de la mémoire et la vitesse d'accès est plus rapide que celle de la base de données. En cas de concurrence élevée, les performances après le verrouillage ne chuteront pas trop.

  • redis peut définir le temps de survie. de valeurs clés. (TTL)

  • redis est simple à utiliser et a une faible surcharge globale de mise en œuvre

  • Cependant, le verrou distribué implémenté à l'aide de redis doit également remplir les conditions suivantes :

Il peut n'en être qu'un en même temps Le thread occupe le verrou et les autres threads doivent attendre que le verrou soit libéré

  1. L'opération de verrouillage doit satisfaire l'atomicité

  2. Aucun blocage ne se produira Par exemple, un thread qui a acquis. le verrou sort soudainement anormalement avant de libérer le verrou, provoquant le déclenchement d'autres threads. Il continuera à attendre en boucle que le verrou soit libéré

  3. L'ajout et la libération du verrou doivent être définis par le même thread

  4. Nous utilisons Redis pour implémenter un verrou de synchronisation distribué afin d'assurer la cohérence des données. Les exigences suivantes Caractéristiques :


satisfait à l'exclusivité mutuelle, un seul thread peut acquérir le verrou en même temps

  • Utilisez le ttl. de redis pour garantir qu'aucun blocage ne se produira, mais cela entraînera également l'expiration du verrou. Le problème de plusieurs threads occupant des verrous en même temps nous oblige à définir raisonnablement le délai d'expiration du verrou pour éviter

  • Utiliser le caractère unique du verrouiller pour garantir que le verrou ne sera pas supprimé accidentellement

Je le fais en fait. Dans le processus, le module de planification a été séparé de l'ensemble du système de collecte et basé sur le client Java Jredis (JRedis est un -performance Client Java utilisé pour se connecter à la base de données clé-valeur de hachage distribuée Redis Un service indépendant, utilisant Spring Boot pour implémenter des fonctions synchrones et asynchrones, afin que d'autres collecteurs puissent demander que les tâches de collecte soient traitées via HTTP. à peu près comme suit :


Le collecteur envoie des demandes de tâches au centre de répartition via HTTP ;

  • Le centre de répartition détermine si le verrou existe, et s'il existe, il renvoie directement un ensemble vide ; le verrou n'existe pas, il verrouille la demande, puis obtient la tâche de collecte correspondante selon les règles source ;

  • Retour Récupérez la tâche (s'il n'y a pas de tâche en attente, retournez vide), puis supprimez le verrou.

  • L'implémentation du code du module de planification est à peu près la suivante :

  • public static List fetchTask(String lockKeyValue, RedisHashUtils redisHashUtils, HttpServletRequest request,
  • HashServiceInterface hif, ZSetServiceInterface zScoreSet, String dicName) {

  • List result = new ArrayList();

      try {

      String dicNameLock = "Dispatcher_Task_Lock";//Planification des tâches verrouillée, lockKeyValue,

                   DateUtil.getYMDHMS());

                                                                                                                                                            // Logique des tâches de traitement

     

                                                                    ....

                                                        ; Désolé, vous n'avez pas fourni les mots originaux qui doivent être réécrits et ne peuvent pas être exécutés. Réécrire

    } catch (

    Exception e) {e.printStackTrace();

    }

    return result;

    }

    Dans le processus de fonctionnement réel, lors de l'ajout d'un verrou, vous devez donner au verrou Ajoutez le

    délai d'expiration

    , sinon lorsqu'une exception inconnue se produit, le verrou risque de ne pas être libéré et le collectionneur ne pourra jamais obtenir la tâche de collecte.

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer