負荷テスト:Node.JS対phpDaemon

プロジェクトの1つで作業するとき、登録ユーザー間の通信を実装するタスクに直面しました。 基本的にはチャットであ​​る必要がありますが、同時に1人の対話者のみと通信できます。



このようなチャットが耐える潜在的な負荷は、約10,000の同時キープアライブ接続です。 各新しいメッセージは、メインデータベースと「高速」データベースに記録する必要があります。そのタスクは、ユーザー間の通信の実際の部分のみを保存することです。つまり、メッセージがすぐに宛先に配信される一種の「一時」ストレージとして機能します。



MongoDBはこのタスクに適しています。 レプリケーションプロセスが十分に確立されているため、local.oplog。$ Mainテーブルに定期的に新しいメッセージ用の個別のデーモンを問い合わせ、もしあれば、JSON形式でアドレスに即座に配信できます。 負荷のかかった安定した動作のために、そのようなデーモンがいくつかあり、数千のスクライブがそれらのそれぞれに接続されます。



そしてここで、悪魔が置かれる「高速サーバー」として使用するものの選択に直面しましたか? これを行うために、 phpDaemonベースとNode.JSベースの2つのソリューションをテストしました。



したがって、初心者向けの完全なチャットアーキテクチャは次のとおりです。



完全なチャット構造

1.完全なチャット構造

  1. 通信を開始する各新しいクライアントは、「高速」サーバー( phpDaemonまたはNode.js )の1つとの接続を確立し、そこからメッセージを受信します。
  2. メインサーバーに新しいメッセージを送信すると、そのメッセージは永続データベース( MySQL )と、ある種の「高速」データベース(この場合はMongoDB )に書き込まれます。
  3. マスターMongoDBは、変更をlocal.oplog。$レプリケーション用のメインコレクションに書き込みます
  4. この時点で、「高速サーバー」は、新しいメッセージの存在について「高速」データベースの調査を実施し、もしあれば、それらが宛先のクライアントに送信します。


テストバージョンでは、永続的なデータベースとユーザー認証はありません。 コレクションから新しいメッセージを取得し、現在アクティブなすべてのクライアントに送信する「高速サーバー」は1つだけです(図2)。



簡素化されたチャット構造

2.簡素化されたチャット構造



今日プレーしているチームの構成:



Node.jsチーム

  1. Node.js( http://nodejs.org
  2. クライアントとNode.js間の接続を確立するためのSocket.IOライブラリ( http://socket.io
  3. Node.jsからMongoDBを操作するためのChristkv Node-mongo-nativeライブラリ( https://github.com/christkv/node-mongodb-native
  4. さて、MongoDBに新しいメッセージをポーリングするための同じライブラリのoplog.jsファイル( https://github.com/christkv/node-mongodb-native/blob/master/examples/oplog.js


PhpDaemonチーム

  1. phpDaemon( http://phpdaemon.net
  2. クライアントとサーバー間の接続を確立するためのphpDaemonからのスクリプト( https://github.com/kakserpom/phpdaemon/tree/master/clientside-connectors/websocket
  3. MongoDBを使用する場合は、組み込みのphpDaemon機能も使用します
  4. データベースを照会するには、わずかに変更されたMongoNodeアプリケーション( https://github.com/kakserpom/phpdaemon/blob/master/app-servers/MongoNode.php )を使用します 。これは、Memcacheに変更を書き込まず、接続しているすべてのユーザーに送信します。


会議の裁判官はApache Benchmarkです。



そのため、MongoDBのポーリングをリードするデーモンの1つを起動します。また、着信クライアントと「通信」します。 別のマシンからApache Benchmarkユーティリティを使用して、複数のキープアライブクライアントを接続します(テスト時間20秒)。 この時点で、サードパーティのフォームを使用して、MongoDBにメッセージを書き始めます。 各デーモンおよびキープアライブ接続の数ごとに、 5回の反復を行い、データを平均して結果を確認します。





完全なリクエスト

1秒あたりのリクエスト

リクエストあたりの時間、ミリ秒

(すべての同時リクエスト全体)



リクエスト、ms

最大リクエスト、ミリ秒

10個のキープアライブ接続

phpDaemon

1147

54.36

18.440

21

7116

Node.JS

1285

64

15.618

16

9064

100個のキープアライブ接続

phpDaemon

1543

75.15

13.313

22

12889

Node.JS

1284

64.12

15.765

17

13347

500のキープアライブ接続

phpDaemon

1365

67.73

14.824

15

15174

Node.JS

1236

61.71

16.611

23

16078

1000キープアライブ接続

phpDaemon

1159

56.99

17.680

19

13103

Node.JS

1528

75.02

13.354

17

16785



は「最高のパフォーマンス」を示します



ご覧のとおり、少数の同時接続(10)では、Node.JSに基づくチャットの方が優れています。 より多くの要求が処理され、1つの要求の処理に必要な時間がそれに応じて短縮されます。 確かに、phpDaemonは最長のリクエストの期間が短くなっていますが、これはそれほど重要ではありません。



化合物の数が100、そして500に増加すると、状況は変わりました。 PhpDaemonはすでにパフォーマンスの面で進歩しています。



また、1000個のキープアライブ接続により、phpDaemonaのパフォーマンスは低下しましたが、Node.JSのパフォーマンスは向上し、かなり大きなギャップが生じました。



All Articles