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.
Les méthodes actuelles d'implémentation de verrous distribués sont les suivantes :Méthodes d'implémentation de verrous distribués
- 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.
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é
- L'opération de verrouillage doit satisfaire l'atomicité
- 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é
- L'ajout et la libération du verrou doivent être définis par le même thread
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
Le collecteur envoie des demandes de tâches au centre de répartition via HTTP ;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 :
- 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
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!