Dans l'architecture Internet d'aujourd'hui, les systèmes distribués sont devenus une base importante pour la construction d'applications hautement disponibles et hautes performances. Dans un environnement où le travail collaboratif multi-nœuds est particulièrement important, le contrôle synchrone des ressources est particulièrement important. Afin de résoudre efficacement les conflits simultanés, les verrous des ressources distribués sont devenus un moyen technique clé pour garantir la cohérence du système. Cet article introduira une solution de mise en œuvre de verrouillage de ressources distribuée réalisable basée sur le langage PHP et combinée avec la file d'attente de messages Kafka.
Le verrouillage des ressources distribué est un mécanisme utilisé pour coordonner l'accès aux ressources partagées par plusieurs nœuds. Son objectif principal est d'empêcher plusieurs nœuds d'exploiter la même ressource en même temps, entraînant une incohérence ou un conflit de données. Les verrous distribués ont généralement deux fonctions centrales:
La file d'attente de messages est un middleware largement utilisé dans les systèmes distribués pour le découplage et la communication asynchrone. En construisant un canal de message pour le verrouillage des ressources, le contrôle de file d'attente des opérations de ressources entre les nœuds peut être réalisé. Cet article utilise Kafka comme outil de file d'attente de messages et combine le développement de PHP pour implémenter les processus de verrouillage distribués.
Avant de commencer le développement, les services Kafka doivent être installés et configurés dans le système. Assurez-vous que le service Kafka fonctionne correctement et que les sujets et les messages peuvent être gérés via des opérations en ligne de commande. Vous pouvez vous référer à la documentation officielle pour terminer l'installation.
Pour être spécifiquement utilisé pour la gestion du verrouillage des ressources, nous créons un nouveau sujet (sujet) dans Kafka nommé Resource_lock :
<span class="fun">bin / kafka-topics.sh --create --bootstrap-server localhost: 9092 - Topic Resource_lock - partitions 1 --réplication-facteur 1</span>
Vous pouvez installer la bibliothèque client PHP de Kafka via Composer:
<span class="fun">Le compositeur a besoin de superbalist / php-pubsub-kafka</span>
Ce qui suit est un exemple de PHP complet montrant comment implémenter le verrouillage et le déverrouillage du flux de contrôle à travers les messages de production et de consommation de Kafka:
<?php
require 'vendor/autoload.php';
use Superbalist\PubSub\Kafka\KafkaConnectionFactory;
class DistributedLock
{
private $topic;
private $connection;
public function __construct($topic)
{
$this->topic = $topic;
$this->connection = $this->createConnection();
}
private function createConnection()
{
$config = [
'metadata.broker.list' => 'localhost:9092',
'enable.auto.commit' => 'false',
];
return KafkaConnectionFactory::create($config);
}
public function acquireLock($identifier)
{
$producer = $this->connection->createProducer();
$message = json_encode(['identifier' => $identifier]);
$producer->produce($this->topic, $message);
}
public function releaseLock($identifier)
{
$consumer = $this->connection->createConsumer();
$consumer->subscribe([$this->topic]);
while (true) {
$message = $consumer->consume(1000);
if ($message) {
$payload = json_decode($message->getPayload(), true);
if ($payload['identifier'] == $identifier) {
break;
}
}
}
}
}
// Exemple de code
$lock = new DistributedLock('resource_lock');
$identifier = 'example_identifier';
echo 'Acquiring lock...' . PHP_EOL;
$lock->acquireLock($identifier);
echo 'Lock acquired!' . PHP_EOL;
// Simuler les opérations des ressources
sleep(3);
echo 'Releasing lock...' . PHP_EOL;
$lock->releaseLock($identifier);
echo 'Lock released!' . PHP_EOL;
Pour utiliser le mécanisme de verrouillage de votre projet, suivez ces étapes:
Cet article présente comment mettre en œuvre le mécanisme de verrouillage des ressources distribué avec PHP et Kafka par des exemples, résolvant efficacement le problème des conflits simultanés entre les ressources partagées entre plusieurs nœuds. Cette méthode a une évolutivité élevée et de bonnes caractéristiques asynchrones et convient à diverses architectures de système distribuées. En plus de Kafka, d'autres middleware de file d'attente de messages tels que RabbitMQ, Redis Stream, etc. peuvent également être utilisés pour des pratiques de développement similaires.