Workerman ドキュメントのサーバー クラスターの実装方法

王林
リリース: 2023-11-08 20:09:18
オリジナル
971 人が閲覧しました

Workerman ドキュメントのサーバー クラスターの実装方法

Workerman は、PHP が非同期ネットワーク通信をより効率的に処理できるようにする高性能 PHP ソケット フレームワークです。 Workerman のドキュメントには、サーバー クラスターの実装方法に関する詳細な手順とコード例が記載されています。

サーバー クラスターを実装するには、まずサーバー クラスターの概念を明確にする必要があります。サーバー クラスターは複数のサーバーをネットワークに接続し、負荷とリソースを共有することでシステムのパフォーマンス、信頼性、拡張性を向上させます。 Workerman では、サーバー クラスタリングは 2 つの方法で実装できます。1 つは中央ロード バランサを使用する方法、もう 1 つは分散共有メモリを使用する方法です。

  1. セントラル ロード バランサの使用 (ロード バランサ)
    セントラル ロード バランサは、分散システムの主要コンポーネントの 1 つです。クライアントからリクエストを受信し、クラスター内のさまざまなサーバーにリクエストを分散します。 Workerman では、中央のロード バランサとして機能する別の PHP スクリプトを作成することで、この機能を実現できます。

まず、Workerman をインストールする必要があります。 Composer を通じてインストールすることも、ソース コードを直接ダウンロードして Autoloader.php ファイルを導入することもできます。次に、balancer.php という名前の PHP スクリプトを作成します。スクリプトでは、まず Workerman の Autoloader ファイルを導入し、関連するクラス ライブラリをロードする必要があります。

<?php
require_once '/path/to/your/workerman/Autoloader.php';
use WorkermanWorker;
use WorkermanProtocolsHttp;
ログイン後にコピー

次に、クライアントのリクエストをリッスンし、そのリクエストをクラスター内のサーバーに分散するワーカー インスタンスを作成します。

$balancer = new Worker('tcp://0.0.0.0:8080');
$balancer->name = 'LoadBalancer';
$balancer->count = 4;

$balancer->onConnect = function($connection) {
    // 连接到达时,选择一个服务器进行负载均衡
    $servers = array('tcp://server1.com:8888', 'tcp://server2.com:8888', 'tcp://server3.com:8888');
    $connection->backendConnection = new Connection($servers[array_rand($servers)]);
};

$balancer->onMessage = function($connection, $data) {
    // 接收到消息时,将消息发送给后端服务器
    $connection->backendConnection->send($data);
};

$balancer->onClose = function($connection) {
    // 连接关闭时,关闭后端服务器的连接
    $connection->backendConnection->close();
};
ログイン後にコピー

上記のコードは、LoadBalancer という名前の Worker インスタンスを作成し、ポート 8080 をリッスンします。接続が到着するたびに、サーバーをランダムに選択することによって、接続がバックエンド サーバーに分散されます。メッセージを受信すると、メッセージはバックエンド サーバーに送信されます。接続が閉じられたら、バックエンド サーバーへの接続を閉じます。

最後に、balancer.php スクリプトを実行し、ターミナルで次のコマンドを実行します。

php balancer.php start
ログイン後にコピー

ロード バランサーを開始した後、クライアントのリクエストをクラスター内の各サーバーに分散できます。

  1. 分散共有メモリの使用

分散共有メモリは、複数のサーバー間で共有されるデータを保存するテクノロジです。 Workerman では、Redis を分散共有メモリとして使用できます。 Redis は、永続ストレージをサポートし、豊富なデータ構造と操作コマンドを提供するオープンソースのインメモリ データベースです。

分散共有メモリを使用するには、最初に Redis サーバーをインストールして構成する必要があります。次に、Workerman のスクリプトで、Redis 接続を使用してデータを共有できます。

<?php
require_once '/path/to/your/workerman/Autoloader.php';
use WorkermanWorker;
use WorkermanProtocolsHttp;
use WorkermanConnectionAsyncTcpConnection;

$worker = new Worker('tcp://0.0.0.0:8888');
$worker->name = 'Server';
$worker->onWorkerStart = function($worker) {
    // 连接Redis服务器
    $redis_connection = new AsyncTcpConnection('tcp://redis.server:6379');
    $redis_connection->connect();
    
    // 将服务器的信息保存到Redis
    $worker->addListener = function($connection) use($redis_connection) {
        $redis_connection->lPush('servers', $connection->getRemoteAddress());
    };
    
    // 从Redis获取服务器列表,用于负载均衡
    $worker->onMessage = function($connection, $data) use($redis_connection) {
        $redis_connection->lRange('servers', 0, -1, function($result) use($connection, $data) {
            // 根据负载均衡策略选择一个服务器
            $server = $result[array_rand($result)];
            
            // 将消息发送给选定的服务器
            $backend_connection = new AsyncTcpConnection('tcp://' . $server);
            $backend_connection->send($data);
            
            // 接收后端服务器的响应,并发送给客户端
            $backend_connection->onMessage = function($connection, $backend_data) use($connection) {
                $connection->send($backend_data);
            };
            
            // 关闭后端服务器的连接
            $backend_connection->onClose = function($connection) {
                $connection->close();
            };
        });
    };
    
    // 在服务器关闭时,从Redis中移除服务器的信息
    $worker->onClose = function($connection) use($redis_connection) {
        $remote_address = $connection->getRemoteAddress();
        $redis_connection->lRem('servers', $remote_address, 1);
    };
};
ログイン後にコピー

上記のコードは、Server という名前の Worker インスタンスを作成し、ポート 8888 をリッスンします。 Worker インスタンスの onWorkerStart コールバック関数では、最初に Redis サーバーに接続し、その後クライアント要求が受信されるたびに、Redis 接続を通じてサーバーのリストが取得され、負荷分散ポリシーに従ってサーバーが選択され、リクエストはサーバーに転送されます。バックエンドサーバーからの応答を受信したら、クライアントに応答を返します。サーバーがシャットダウンされたら、Redis からサーバー情報を削除します。

最後に、server.php スクリプトを実行し、ターミナルで次のコマンドを実行します。

php server.php start
ログイン後にコピー

サーバーを起動した後、クライアント経由でサーバーに接続し、負荷分散を実現できます。

上記の 2 つの方法により、Workerman フレームワークを使用してサーバー クラスターを実装できます。中央ロード バランサーを使用する場合でも、分散共有メモリを使用する場合でも、システムのパフォーマンスと信頼性を向上させて、大規模なアプリケーションのニーズを満たすことができます。もちろん、実際のアプリケーションでは、特定のシナリオとニーズに基づいてサーバー クラスターの実装をさらに最適化および拡張できます。

以上がWorkerman ドキュメントのサーバー クラスターの実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート