ホームページ  >  記事  >  PHPフレームワーク  >  Swoole と Redis の統合: 高可用性 IM システムを迅速に構築

Swoole と Redis の統合: 高可用性 IM システムを迅速に構築

王林
王林オリジナル
2023-06-13 09:55:081091ブラウズ

モバイル インターネットの台頭により、インスタント メッセージング (IM) システムは私たちの日常生活に欠かせないものになりました。したがって、実用的で高性能な IM システムの開発は、多くの開発者が追求する目標の 1 つとなっています。このプロセスでは、Swoole と Redis が一般的に使用される 2 つのパフォーマンス ツールであり、高可用性の IM システムを迅速に構築するのに役立ちます。

この記事では、Swoole と Redis の基本概念と原則を紹介し、これら 2 つのツールに基づいた IM システム アーキテクチャの事例と実装計画を示します。この記事を通じて、これら 2 つのツールを使用して高性能な IM システムを構築する方法を理解していただければ幸いです。

1. Swoole と Redis の概要

1.1 Swoole

Swoole は、PHP に基づいた高度なネットワーク フレームワークであり、完全に非同期の高性能サーバーサイド エンジンです。 TCP、UDP、WebSocket、および HTTP プロトコルをサポートします。 Swoole は、コルーチン テクノロジを使用してノンブロッキング非同期プログラミングを実装する、epoll または kqueue に基づく React メカニズムの主な理由により、PHP プロセスのパフォーマンスと同時実行性を大幅に向上させることができます。

1.2 Redis

Redis は、文字列、ハッシュ、リスト、セット、順序付きセットなど、さまざまなデータ構造をサポートするオープン ソースのメモリ内キー/値データベースです。 Redis は高いパフォーマンスとスケーラビリティを備えており、数百万の同時リクエストを処理できます。 Redis は主に、キャッシュ、メッセージ キュー、分散ロックなどのシナリオで使用されます。

2. Swoole と Redis の統合

2.1 Swoole と Redis の連携方法

Swoole で Redis を使用するには通常 2 つの方法があります:

    #Swoole Redis クライアントを使用する
  • Swoole Coroutine Redis クライアントを使用する
このうち、Swoole Redis クライアントは従来の Redis クライアントであり、リクエストの応答を処理するためにコールバック関数を使用する必要があります。 Coroutine Redis クライアントは、コルーチンを通じてリクエストと応答を処理するため、より便利で効率的に使用できます。

2.2 アーキテクチャの説明

リアルタイム通信を実現するために、IM システムは通常、WebSocket プロトコルを使用してメッセージを送信します。この記事では、Swoole と Redis をベースにした WebSocket サーバーを構築し、クライアントから送信されたメッセージは Redis に保存され、サーバーを通じて他のクライアントにプッシュされます。

    1. クライアントはメッセージを WebSocket サーバーに送信します
    1. WebSocket サーバーはメッセージを Redis に保存します
    1. Redis がサーバーにメッセージをプッシュする
    1. WebSocket サーバーが他のクライアントにメッセージをプッシュする
3. 実施計画

次に、各ステップの実施計画を詳しく紹介します。

3.1 サーバーコード

(1) WebSocket サーバーの起動

Swoole が提供する WebSocket サーバー API を使用してサーバーを起動します。コードは次のとおりです。

$server = new SwooleWebSocketServer("0.0.0.0", 9501);

$server->on('open', function (SwooleWebSocketServer $server, $frame) {
    echo "connection open
";
});

$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    $redis = new SwooleCoroutineRedis();
    $redis->connect('127.0.0.1', 6379);
    $redis->lPush('messages', $frame->data);
});

$server->on('close', function (SwooleWebSocketServer $server, $fd) {
    echo "connection close
";
});

$server->start();

This コード スニペットでは、$server->on() 関数を使用して、WebSocket のオープン、メッセージ、およびクローズ イベントのコールバック関数を設定します。クライアントがサーバーに接続すると、open 関数のコードが実行され、クライアントがサーバーにメッセージを送信すると、message 関数のコードが実行されます。メッセージ関数では、Coroutine Redis クライアントを作成し、クライアントから送信されたメッセージを Redis キューにキャッシュします。

(2) クライアントにメッセージをプッシュする

次に、サーバーがクライアントにメッセージをプッシュするロジックを実装する必要があります。これは、Swoole が提供する Push() 関数を使用して実現できます。コードは次のとおりです:

// 推送消息给客户端
$server->tick(1000, function () use ($server) {
    $redis = new SwooleCoroutineRedis();
    $redis->connect('127.0.0.1', 6379);

    while ($message = $redis->rPop('messages')) {
        foreach ($server->connections as $fd) {
            $server->push($fd, $message);
        }
    }
});

このコードでは、Swoole が提供する check() 関数を使用してコードを定期的に実行し、 Redis からコードを実行する Coroutine Redis クライアント メッセージを取得し、すべてのクライアントにメッセージをプッシュします。

3.2 クライアント コード

クライアント コードは比較的単純で、WebSocket クライアントを使用して WebSocket サーバーに接続し、JavaScript を通じてデータを送受信するだけです。コードは次のとおりです。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>IM System</title>
</head>
<body>
    <h1>IM System</h1>
    <form>
        <label for="name">Name:</label>
        <input type="text" id="name">
        <br><br>
        <label for="message">Message:</label>
        <input type="text" id="message">
        <br><br>
        <input type="submit" value="Send Message">
    </form>
    <br><br>
    <div id="message-list"></div>
    <script>
        var socket = new WebSocket('ws://localhost:9501');

        socket.onopen = function(event) {
            console.log('WebSocket connect succeed');
        };

        socket.onmessage = function(event) {
            var message = JSON.parse(event.data);

            var messageList = document.getElementById('message-list');
            var p = document.createElement('p');
            p.innerText = message.name + ": " + message.message;
            messageList.prepend(p);
        };

        document.querySelector('form').addEventListener('submit', function(event) {
            event.preventDefault();

            var name = document.getElementById('name').value;
            var message = document.getElementById('message').value;

            socket.send(JSON.stringify({
                name: name,
                message: message
            }));

            document.getElementById('message').value = "";
        });
    </script>
</body>
</html>

このコードでは、まず WebSocket クライアントを使用して WebSocket サーバーに接続します。クライアントが正常に接続すると、JavaScript の WebSocket オブジェクトの send() メソッドを介してサーバーにメッセージを送信できます。また、サーバーによってプッシュされたメッセージを受信するように onmessage コールバック関数を設定する必要もあります。

4. 概要

この記事では、Swoole と Redis の基本概念と原則を紹介し、Swoole と Redis に基づく WebSocket サーバー アーキテクチャの事例と実装計画を共有しました。この事例を通じて、Swoole と Redis がどのように連携して高性能、高可用性の IM システムを構築するかを学ぶことができます。

もちろん、これは単なる例であり、実際には、セキュリティ、パフォーマンスの最適化など、多くの側面を考慮する必要があります。この記事を通じて、読者の皆様がこれら 2 つのツールの使い方を知っていただくとともに、今後もこれら 2 つのツールとその他の関連技術を深く研究し、高性能アプリケーションの開発にさらに貢献していただければ幸いです。

以上がSwoole と Redis の統合: 高可用性 IM システムを迅速に構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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