Workermanがmysql接続プールを記述する方法と機能

リリース: 2021-02-01 12:07:14
転載
4940 人が閲覧しました

Workermanがmysql接続プールを記述する方法と機能

まず、接続プールが使用される理由と、接続プールがどのような問題を解決できるかを理解する必要があります。

接続プールの主な機能:

1. データ サーバーは TCP 接続の 3 ウェイ ハンドシェイクを確立し、4 回のハンドシェイクのオーバーヘッドを伴って接続を閉じることで、クライアントと mysql サーバーの負荷が軽減され、リクエストの応答時間が短縮されます

2. データベースへの同時接続数を減らすと、アプリケーション サーバーの過負荷の問題が解決されます。問題 1

を解決するには、Workerman のデータベース接続プールが最も効率的な方法ではなく、トラブルが発生します。 PHP は単一プロセスおよび単一スレッドであるため、PHP を使用してデータベース接続プールを実装するには、必ず別のプロセスが必要になります。これにはプロセス間通信が含まれ、mysql との直接通信の元のプロセスが接続プールとのプロセスになり、ここでも、MySQL 通信によりアプリケーション側の負荷が増加します。

問題 1 を解決する最も効率的な方法は、ビジネス プロセスごとにデータベースの単一インスタンス (Workerman が提供する DB クラスなど) を確立し、データベースへの長い接続を実装して、各ビジネス プロセスのすべてのリクエストが実行されるようにすることです。プロセスは独自のものを使用しますデータベースの長い接続の場合、プロセスのライフサイクル全体で TCP ハンドシェイクと切断ウェーブのオーバーヘッドは 1 つだけあり、アプリケーションは mysql と直接通信します接続プールのようなプロセス間 IPC 通信の中間層はありません、その中でも性能は最高です。

質問 2 の場合

まず、アプリケーション サーバーの数と、各サーバーが mysql に同時に接続できる数を確認します。アプリケーション サーバーが 10 台しかなく、各サーバーに 50 のプロセスがあり、各プロセスに 1 つのデータベース接続がある場合、mysql サーバーへの同時接続は合計 10*50=500 (アクティブな接続ではない) のみとなり、同時接続は 500 になります。 mysql の接続 これは簡単です 問題 2 を解決するには、接続プールを使用する必要はありません。

アプリケーション サーバーが 1,000 台ある場合は接続プールが必要ですが、1,000 台のアプリケーション サーバーに対して接続プールが 1,000 個あるため、この接続プールをローカル アプリケーション サーバーで実行する接続プールにすることはできません。接続プールは 10 個の接続しか開かないため、データベース内の接続数はすぐにいっぱいになってしまいます。したがって、現在のサーバー上の複数のタスク プロセスによって実装された接続プールを開くことで、この問題が解決されるとは期待しないでください。

1,000 のアプリケーション サーバーのクラスターでは、各サーバーに複数のプロセスをセットアップして接続プーリングを実装することも信頼性の低い方法です。問題 2 を解決する実際の方法は、独立したデータベース接続プール サーバーまたはクラスターを確立して、すべてのデータベース リンクをグローバルに管理することです。

要約すると、

質問 1 のためだけに PHP の mysql 接続プールを実装している場合、データベース シングルトンは、いわゆる接続プールよりもシンプルで効率的なアプローチです。

質問 2 を実現するには、ある程度の規模のビジネスが必要ですが、どうしても Workerman を使用して別の接続プール クラスタを作成したい場合は、次のような簡単な方法で、いくつかのタスク プロセスを作成します。各プロセスはデータベース接続を作成します。タスク プロセスは SQL リクエストを受信した後、それを mysql サーバーに送信します。mysql サーバーが戻った後、タスク プロセスは結果を SQL イニシエーターに送信します。

接続プールのコードは次のようになります。複数のサーバーで構成される接続プール クラスターの場合は、前に lvs を追加するのが最善です:

// task worker,使用Text协议
$task_worker = new Worker('Text://0.0.0.0:1234');
$task_worker->count = 64;
$task_worker->name = 'MysqlTask';
$task_worker->onMessage = function($connection, $sql)
{
     // 执行sql.... 得到结果,这里省略....
     $sql_result = your_mysql_query($sql);
     // 发送结果
     $connection->send(json_encode($sql_result));
};
ログイン後にコピー

Call in workerman:

use \Workerman\Connection\AsyncTcpConnection;

// 与远程连接池服务建立异步链接,ip为远程连接池服务的ip,如果是集群就是lvs的ip
$sql_connection = new AsyncTcpConnection('Text://ip:1234');
// 发送sql
$sql_connection->send("SELECT ... FROM .....");
// 异步获得sql结果
$sql_connection->onMessage = function($sql_connection, $sql_result)
{
     // 这里只是打印结果
     var_dump(json_decode($task_result));
};
// 执行异步链接
$sql_connection->connect();
ログイン後にコピー

続き ワーカーマンの知識については、PHP 中国語 Web サイトの

ワーカーマン チュートリアル

列に注目してください。

以上がWorkermanがmysql接続プールを記述する方法と機能の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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