Maison  >  Article  >  développement back-end  >  Intégration et évolutivité des files d'attente de messages et des systèmes distribués par Swoole et Workerman

Intégration et évolutivité des files d'attente de messages et des systèmes distribués par Swoole et Workerman

WBOY
WBOYoriginal
2023-10-15 16:49:41597parcourir

Intégration et évolutivité des files dattente de messages et des systèmes distribués par Swoole et Workerman

Swoole et Workerman sont tous deux des moteurs de communication réseau PHP. Ils offrent de puissantes capacités d'intégration et d'expansion des files d'attente de messages et des systèmes distribués. Cet article démontrera leur application à cet égard à travers des exemples de code spécifiques.

Tout d’abord, jetons un coup d’œil aux caractéristiques de Swoole et Workerman. Swoole est un moteur de communication réseau asynchrone PHP pour les environnements de production. Il prend en charge TCP/UDP/Unix Socket/HTTP/WebSocket et d'autres protocoles et fournit des fonctions telles que des minuteries, des tâches asynchrones et la gestion des sous-processus. Workerman est un framework de socket PHP hautes performances qui adopte un modèle multi-processus et peut gérer des connexions simultanées massives.

En termes de file d'attente des messages, Swoole fournit la fonction de rappel onMessage de swoole_server, qui peut stocker les messages reçus dans la file d'attente des messages. Nous pouvons utiliser Redis comme file d'attente de messages et intégrer Swoole via l'extension swoole_redis.

<?php
$serv = new swoole_server("127.0.0.1", 9501, SWOOLE_BASE, SWOOLE_SOCK_TCP);

$serv->set([
    'worker_num' => 4,    // 设置工作进程数
]);

$serv->on('WorkerStart', function ($serv, $worker_id) {
    // 连接Redis
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);

    // 消息队列名称
    $queue_name = 'message_queue';
    
    // 消费消息队列
    swoole_timer_tick(1000, function () use ($redis, $queue_name) {
        while ($message = $redis->lPop($queue_name)) {
            // 处理消息
            echo "Received message: " . $message . "
";
        }
    });
});

$serv->on('Receive', function ($serv, $fd, $from_id, $data) {
    // 将接收到的消息存入Redis消息队列
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis->rPush('message_queue', $data);
});

$serv->start();
?>

Dans le code ci-dessus, nous avons créé un serveur Swoole et défini le nombre de processus de travail sur 4. Dans la fonction de rappel WorkerStart, nous avons connecté Redis et interrogé la file d'attente des messages via une minuterie, en utilisant la fonction de traitement des messages comme fonction de rappel. Lorsqu'un message arrive, la fonction de rappel onReceive est appelée pour stocker le message reçu dans la file d'attente des messages Redis.

Ensuite, jetons un coup d'œil à l'intégration et à l'évolutivité de Workerman des files d'attente de messages et des systèmes distribués. Workerman propose un développement événementiel via son composant EventManager.

<?php
require_once __DIR__ . '/Workerman/Autoloader.php';

use WorkermanWorker;
use WorkermanRedisQueueClient;
use WorkermanEventLoopSelect;

$worker = new Worker('tcp://127.0.0.1:9501');
$worker->count = 4;

$worker->onWorkerStart = function ($worker) {
    $redis = new PredisClient();
    $queue = new Client($redis);
    
    $queue->onMessage = function ($message) {
        // 处理消息
        echo "Received message: " . $message . "
";
    };
    
    $queue->run();
};

$worker->onMessage = function ($connection, $data) {
    global $worker;
    $worker->queue->sendMessage($data);
};

Worker::$eventLoopClass = Select::class;
Worker::runAll();

Dans le code ci-dessus, nous avons créé un serveur Workerman et mis en place 4 processus de travail. Dans la fonction de rappel onWorkerStart, nous nous sommes connectés à Redis et avons créé un client de file d'attente Redis. Traitez les messages en définissant la fonction de rappel onMessage du client de file d'attente. Lorsqu'un message est reçu, la fonction de rappel onMessage est appelée pour envoyer le message à la file d'attente de messages Redis.

Grâce aux exemples de code ci-dessus, nous pouvons voir que Swoole et Workerman peuvent être intégrés à des files d'attente de messages (telles que Redis) pour implémenter la livraison de messages dans les systèmes distribués. En développement réel, nous pouvons choisir les outils appropriés en fonction de besoins spécifiques. Swoole et Workerman offrent tous deux de bonnes capacités d'extension et peuvent être personnalisés selon les besoins.

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn