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

モバイル インターネットの台頭により、インスタント メッセージング (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 id="IM-System">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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)