ホームページ  >  記事  >  PHPフレームワーク  >  ワーカーマンは mysql 接続プールを書き込みます

ワーカーマンは mysql 接続プールを書き込みます

尚
転載
2019-12-19 17:19:112064ブラウズ

ワーカーマンは mysql 接続プールを書き込みます

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

接続プールの主な機能

1. データとの接続数を減らす サーバーは 3 ウェイ ハンドシェイクで TCP 接続を確立し、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));
};

ワーカーマンの呼び出し

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();

ワーカーマンの知識をさらに増やす ワーカーマン チュートリアル 列に注目してください。

以上がワーカーマンは mysql 接続プールを書き込みますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。