ホームページ  >  記事  >  PHPフレームワーク  >  Swoole は信頼性の高いパブリッシュおよびサブスクライブ システムを実装しています

Swoole は信頼性の高いパブリッシュおよびサブスクライブ システムを実装しています

王林
王林オリジナル
2023-06-13 20:32:281561ブラウズ

インターネットの発展に伴い、メッセージのリアルタイムのプッシュとサブスクリプションを実現する必要があるアプリケーションがますます増えています。この要件をサポートするには、信頼性の高いパブリッシュおよびサブスクライブ システムが必要です。 Swoole は、高性能ネットワーク通信フレームワークとして、この需要に十分対応できます。

Swoole は PHP 言語の拡張モジュールであり、非同期、並列、高性能ネットワーク通信およびマルチプロセス同時処理機能を提供します。 Swoole に基づいて開発されたアプリケーションは、より高い同時実行性とより短い応答時間をサポートできます。この記事では、Swooleを使って信頼性の高いパブリッシュ&サブスクライブシステムを実現する方法を紹介します。

1. パブリッシュ/サブスクライブ システムの基本概念

パブリッシュ/サブスクライブ システムは、1 対多のメッセージのパブリッシュとサブスクリプションをサポートするメッセージング モデルです。パブリッシャーは 1 つ以上のトピックにメッセージをパブリッシュし、サブスクライバーは自分の興味に応じてこれらのトピックをサブスクライブして、対応するメッセージを受信できます。

パブリッシュおよびサブスクライブ システムは、通常、パブリッシャー、サブスクライバー、メッセージ ブローカー (メッセージ ブローカー) の 3 つの部分で構成されます。パブリッシャーはメッセージ ブローカーにメッセージを送信し、サブスクライバーはメッセージ ブローカーからのメッセージをサブスクライブします。パブリッシャーとサブスクライバーは直接通信しません。メッセージ ブローカーは、対応するサブスクライバーにメッセージをルーティングする役割を果たします。

2. Swoole の基本概念

Swoole を理解してパブリッシュおよびサブスクライブ システムを実装する前に、Swoole のいくつかの基本概念を理解する必要があります。

  1. プロセス

Swoole では、プロセスとは独立した実行環境を指します。 Swoole はマルチプロセスをサポートしており、複数のプロセスを作成することで同時処理を実現できます。

  1. サーバー

サーバーは Swoole フレームワークのコア モジュールであり、TCP サーバーまたは UDP サーバーを作成できます。サーバーが起動すると、メイン プロセスと複数のサブプロセスが作成されます。メイン プロセスはポートでのリッスンを担当し、サブプロセスは特定のリクエストを処理します。

  1. タイマー

Swoole は、指定された時間間隔内でコードを実行できるタイマー関数を提供します。タイマーは、スケジュールされたタスクやスケジュールされたチェックなどのシナリオで使用できます。

  1. Coroutine

Coroutine は、1 つのスレッドで複数のコルーチンを同時に実行できる軽量のスレッドです。コルーチンは非同期プログラミングを実装し、従来のマルチスレッド プログラミングにおけるスレッド切り替えのオーバーヘッドを回避できます。 Swoole は、同時実行性の高いネットワーク プログラミングの実装に使用できるコルーチンのサポートを提供します。

3. Swoole でパブリッシュ アンド サブスクライブ システムを実装する手順

次に、Swoole を使用してパブリッシュ アンド サブスクライブ システムを実装する方法を紹介します。コードの複雑さを軽減するために、サブスクライバによるアクティブ ポーリングを使用してサブスクリプション機能を実装します。

  1. メッセージ エージェントの作成

まず、メッセージを受信し、対応するサブスクライバーにルーティングする役割を担うメッセージ エージェントを作成する必要があります。 Swoole が提供する TCP サーバーとプロセス管理機能を使用して、メッセージ ブローカーを実装できます。

$server = new SwooleServer('0.0.0.0', 8080, SWOOLE_PROCESS);
$server->set([
    'worker_num' => 2,
    'daemonize' => false,
]);
$server->on('WorkerStart', function($serv, $worker_id) {
    // 创建消息队列
    $queue_key = ftok(__FILE__, 'a');
    $queue = msg_get_queue($queue_key, 0666 | IPC_CREAT);
    // 将消息队列作为全局变量存放起来
    global $message_queue;
    $message_queue = $queue;
    // 启动消息处理进程
    if ($worker_id == 0) {
        $process = new SwooleProcess(function($process) {
            global $message_queue;
            while (true) {
                // 从消息队列中获取消息
                if (msg_receive($message_queue, 0, $msg_type, 1024, $msg, true, MSG_IPC_NOWAIT)) {
                    // 将消息发送给对应的订阅者
                    // TODO:实现发送消息的逻辑
                }
                // 隔一段时间循环一次
                usleep(100);
            }
        }, false, false);
        $process->start();
    }
});
$server->on('Connect', function($serv, $fd) {
    echo "Client[$fd]: Connect.
";
});
$server->on('Receive', function($serv, $fd, $from_id, $data) {
    global $message_queue;
    // 接收到消息,将消息存放到消息队列
    if (msg_send($message_queue, 1, $data, true, true)) {
        echo "Received message: $data
";
    } else {
        echo "Failed to send message to message queue.
";
    }
});
$server->on('Close', function($serv, $fd) {
    echo "Client[$fd]: Close.
";
});
$server->start();

上記のコードでは、TCP サーバーを作成し、2 つの子プロセスを設定しました。各子プロセスが開始されると、メッセージ キューを作成し、それをグローバル変数 $message_queue に保存します。最初のサブプロセスでは、メッセージ キューからメッセージを取得し、対応するサブスクライバーにメッセージを送信するメッセージ処理プロセスを作成します。メッセージを受信すると、msg_send 関数を通じてメッセージをメッセージ キューに保存します。

  1. サブスクリプション機能の実装

サブスクリプション機能とは、サブスクライバーが自分の興味に応じてサブスクライブする必要があるトピックを選択し、それによって関連するメッセージを受信できることを意味します。 Swoole のコルーチンを通じてサブスクリプション機能を実装できます。

$client = new SwooleClient(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 8080)) {
    echo "Failed to connect to server.
";
    exit(1);
}
// 订阅主题
if (!$client->send("subscribe:topic1")) {
    echo "Failed to send subscribe message.
";
    exit(1);
}
// 接收消息
while (true) {
    $data = $client->recv();
    if ($data === false) {
        echo "Failed to receive message.
";
        break;
    }
    if (empty($data)) {
        continue;
    }
    echo "Received message: $data
";
}
$client->close();

上記のコードでは、TCP クライアントを作成し、メッセージ ブローカーのポートに接続します。サブスクリプション メッセージは send 関数を通じて送信され、サブスクリプション トピックは topic1 です。メッセージを受信するときは、ループを使用して新しいメッセージがあるかどうかを確認し、recv 関数を使用してブロックして新しいメッセージを待ちます。

  1. パブリッシング関数の実装

パブリッシュ関数とは、パブリッシャーが指定されたトピックにメッセージをパブリッシュできることを意味します。 Swoole の TCP クライアントを使用して公開機能を実装できます。

$client = new SwooleClient(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 8080)) {
    echo "Failed to connect to server.
";
    exit(1);
}
// 发布消息
if (!$client->send("publish:topic1:message1")) {
    echo "Failed to send publish message.
";
    exit(1);
}
$client->close();

上記のコードでは、TCP クライアントを作成し、メッセージ ブローカーのポートに接続します。 send 関数を使用してメッセージを公開します。公開トピックは topic1 で、メッセージの内容は message1 です。

4. 概要

Swoole は、高性能で同時実行性の高いネットワーク アプリケーションの実装に役立つ強力なネットワーク プログラミング フレームワークです。この記事では、Swooleを使って信頼性の高いパブリッシュ&サブスクライブシステムを実装する方法を紹介します。主に、メッセージエージェントの作成、サブスクリプション機能の実装、パブリッシング機能などです。 Swoole を使用してパブリッシュおよびサブスクライブ システムを実装すると、システムのパフォーマンスと信頼性が向上し、メッセージング機能を必要とするさまざまなアプリケーション シナリオに適しています。

以上がSwoole は信頼性の高いパブリッシュおよびサブスクライブ システムを実装していますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。