まず、接続プールを使用する理由と、接続プールによってどのような問題が解決できるかを理解する必要があります。 接続プールの主な機能は次のとおりです。 1. データサーバーとのTCP接続を確立するための3ウェイハンドシェイクと接続を閉じるための4ウェイハンドシェイクのオーバーヘッドを削減し、クライアントとMySQLサーバーの負荷を軽減し、リクエスト応答時間を短縮します。 2. データベースへの同時接続数を減らす。つまり、アプリケーションサーバーの数が多すぎるためにデータベースへの接続が多すぎるという問題を解決する。 問題を解決するには1 Workerman では、データベース接続プールは最も効率的な方法ではなく、むしろ面倒なアプローチです。 PHP はシングルプロセス、シングルスレッドのプログラムであるため、PHP を使用してデータベース接続プールを実装するには別のプロセスが必要になります。これによりプロセス間通信が発生し、MySQL と直接通信する元のプロセスが接続プールとの通信、そして MySQL との通信に変更され、アプリケーション側の負荷が増加します。 問題 1 を解決する最も効率的な方法は、各ビジネス プロセスにデータベース シングルトン (workerman が提供する DB クラスなど) を作成し、データベースの永続的な接続を実装することです。この方法では、各プロセスのすべての要求が独自のデータベースの永続的な接続を使用します。プロセス ライフ サイクル全体では、TCP ハンドシェイクと切断波のオーバーヘッドが 1 つだけあります。さらに、アプリケーションは、接続プールなどのプロセス間 IPC 通信の中間層なしで、MySQL と直接通信します。パフォーマンスは間違いなく最高です。 質問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 = new Worker('Text://0.0.0.0:1234'); $task_worker->カウント = 64; $task_worker->名前 = 'MysqlTask'; $task_worker->onMessage = 関数($connection、$sql) { // SQL を実行します.... 結果を取得しますが、ここでは省略します.... $sql_result = your_mysql_query($sql); // 結果を送信します $connection->send(json_encode($sql_result)); }; 作業員を呼ぶ: \Workerman\Connection\AsyncTcpConnection を使用します。 // リモート接続プール サービスとの非同期接続を確立します。IP アドレスは、リモート接続プール サービスの IP アドレスです。クラスターの場合は、LVS サービスの IP アドレスです。 $sql_connection = 新しい 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(); 以上が今回紹介したworkermanでのMySQLコネクションプールの書き方についてのノウハウです。補足事項がありましたら123WORDPRESS.COMの編集者までご連絡ください。 以下もご興味があるかもしれません:
|
<<: Springboot+Vue-Cropperでアバターの切り取りとアップロードの効果を実現
>>: Nginx リバース プロキシ springboot jar パッケージ プロセス分析
この記事では、Centos7.6 システムと Oracle11g を例に挙げます。 1. まずデータ...
追加するdocker run -it -name test -d nginx:latest /bin...
フロントエンド開発者がよく遭遇する問題は、ユーザーに情報を提示するためのポップアップ ウィンドウを作...
バージョンアップデートにより、元のユーザーのパスワードフィールドがauthentication_st...
目次JSON は次の 2 つの構造に基づいて構築されます。 2. JSON形式1. オブジェクト2....
目次1. はじめに2. Viteプロジェクトを作成する1. viteをインストールする2. プロジェ...
まず実装手順について説明します。最終結果 2. コードの実装HTML部分 <div class...
1. 同じタイプの空の要素を追加し、要素の CSS 属性 clear:both; を設定します。 ...
均等に分散されたレイアウトの場合、通常はネガティブ マージン方式を使用します。次の図は平均的なレイア...
pingスキャンをオフにする(役に立たないが)まずルートに切り替えるエコー 1 > /proc...
1. ファイル名検索を実行するwhich ('実行可能ファイル' を検索) //PA...
現在シミュレーションしているのは、マスター スレーブ システム (ホスト 1 台とスレーブ 1 台)...
目次問題の原因:解決:解決:私は Centos7 を使用しています (理論的にはこの方法は Cent...
目次1. ブラウザのサポート2.エクスポートモジュールのエクスポート3. モジュールをインポートする...
概要プロトタイプ パターンは、プロトタイプ インスタンスによって作成されるオブジェクトの型を指し、こ...