非同期アプリサーバーと複数のブロックサーバー

jは

tl; dr多くのRailsアプリまたは1つのVertx / Play!アプリ?

Play!などの非同期アプリサーバーを使用することの長所と短所について、チームの他のメンバーと話し合っています。フレームワーク(Netty上に構築)とRailsアプリサーバーの複数のインスタンスの起動。

Nettyは非同期/非ブロッキングであることがわかっています。つまり、データベースクエリ、ネットワークリクエスト、または同様の非同期呼び出し中に、イベントループスレッドがブロックされたリクエストから処理/処理の準備ができている別のリクエストに切り替えることができます。これにより、CPUをブロックして待機するのではなく、ビジー状態に保つことができます。

私は賛成するか、Playのようなものを使用していると主張しています!フレームワークまたはVertx.io、非ブロッキングのもの...スケーラブル。一方、私のチームメンバーは、Railsアプリの複数のインスタンスを使用することで同じメリットを得ることができると言っています。Railsアプリは、箱から出して1つのスレッドしか付属しておらず、JVM上のアプリのように真の同時実行性はありません。 。彼らは、1つのPlayのパフォーマンスに匹敵するのに十分なアプリインスタンスを使用するだけだと言っています!アプリケーション(または私たちが使用する多くのPlay!アプリ)、およびRailsアプリがブロックすると、OSはプロセスを別のRailsアプリに切り替えます。結局、彼らはCPUが同じ量の仕事をし、私たちが同じパフォーマンスを得るだろうと言っています。

だからここに私の質問があります:

  • 上記の議論に論理的な誤謬はありますか?OSはRailsアプリインスタンスを管理し、Netty(スレッドをコアに非常にうまくマップするJVMでも実行されます)はイベントループでリクエストを管理しますか?
  • OSは、NettyやVertxのようなもの、あるいはRuby独自のEventMachine上に構築されたものと同じように、ブロッキング呼び出しをオンにするパフォーマンスがありますか?
  • パフォーマンスに匹敵する十分なRailsアプリインスタンスがあればPlay!アプリの場合、サーバーの実行にコストの顕著なコスト差がありますか?私の意見では、コストの差がなければ、どの方法を使用してもかまいません。1つのPlayよりも100万のRailsアプリを実行する方が経済的に安かったら、撃ちましょう!アプリ私はむしろそれをしたいです。
  • これらのアプローチのいずれかを使用することで、私が尋ねることができないかもしれない他のいくつかの利点は何ですか?
トッドホフ

どちらのアプローチも機能し、機能しました。したがって、切り替えによって高い開発コストやスケジュールの打撃が発生する場合は、おそらく努力する価値はありません...まだ。コストが許容できないほど高くなったときに切り替えます。マイクロサービスを段階的な切り替え戦略として使用することを考えてください。

開発サイクルの早い段階で切り替えを行うのは理にかなっているかもしれません。書き直しは苦痛です。

または、切り替える必要がなく、レールがチャームのようにユースケースで機能する可能性があります。そして、あなたはあなたの顧客を幸せにすることに非常に成功しているので、現金はちょうど入っています。

単一サーバーをブロックするアプローチの欠点のいくつか:

  • メモリ使用量の増加ソース:複数のプロセス、メモリリーク、共有データ構造の欠如(通信コストが増加し、一貫性の問題が発生します)。

  • 並列処理の欠如これには2つの結果があります:より多くのボックスとより多くのレイテンシー同じ負荷を処理するには、はるかに多くのボックス数が必要になる可能性があります。したがって、拡張する必要があり、お金の問題がある場合、これは問題になる可能性があります。それが問題でなければ、それは問題ではありません。サーバーでは、レイテンシーの増加を意味します。これは、プロセスを増やすことでは改善できない一種のレイテンシーであり、アプリによってはキラーな議論になる可能性があります。

railsからnode.jsとgolangにそのような切り替えを行った人のいくつかの例:

これらの投稿は、おそらくあなたのグループが経験していることを説明する議論を表しています。残念ながら、この決定は明白なものではありません。

それは、構築しているものの性質、チームの性質、リソースの性質、スキルの性質、目標の性質、およびすべての異なるトレードオフをどのように評価するかによって異なります。

コストは本当に下がるでしょうか?サーバーの数に関係なく、同じ量の計算が実行されませんか?

行われている作業の種類と規模によって異なります。通常、WebサービスはIOバウンドであり、データベース、キャッシュなどの他のサービスからの応答を待機します。

シングルスレッドサーバーを使用している場合、プロセスはIOで頻繁にブロックされるため、何も実行されません。対照的に、非ブロックサーバーは、シングルスレッドサーバーがブロックされている間、多くの要求を処理できます。プロセスを追加し続けることはできますが、1台のマシンで実行できるプロセスは非常に多くなります。ノンブロッキングサーバーは、要求を処理するためにCPUをビジー状態に保ちながら、同じ数のプロセスを持つことができます。ノンブロッキングサーバーを使用すると、より小型で安価なマシンでより高い負荷を処理できることがよくあります。

予想される要求率を許容可能な数のボックスで処理でき、大きなスパイクが予想されない場合は、シングルスレッドサーバーで問題ありません。ノンブロッキングサーバーは、必ずしもマシンを追加しなくても、負荷の急上昇を吸収するのに最適です。

応答の待ち時間が実際には問題にならないような作業である場合は、より少ないノードで処理できます。

ワークロードがCPUにバインドされている場合は、サーバーがIOでブロックしないため、並列処理の同じ機会がないため、とにかくより多くのボックスが必要になります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

複数のサーバーのRsyncバックアップスクリプト

分類Dev

アウトバーンサブスクリプションからのメッセージを非同期で非ブロッキングで処理します

分類Dev

アプリサーバーとLoRaWANベースのセンサーネットワーク間の双方向非同期通信

分類Dev

TCPIP非同期サーバー接続のドロップアウト

分類Dev

複数のクライアントを持つ非同期ソケットサーバー

分類Dev

複数のアプリケーション間で同期するApacheロードバランサーデータ

分類Dev

複数のJVMと単一のアプリサーバー

分類Dev

カラーバーと複数のサブプロットの問題

分類Dev

サーバーアプリケーションでの同期-非同期-マルチスレッド

分類Dev

C#Mysql-非同期待機サーバーのデータベースクエリでのロックの使用

分類Dev

RxPy:外部コールバックからホットオブザーバブルを作成し、複数の非同期プロセスをサブスクライブする方法は?

分類Dev

gRPCcpp非同期サーバーと同期サーバー

分類Dev

RxSwiftを使用した非同期タスクと複数のオブザーバー

分類Dev

GWT-サーバー側の同期ブロック

分類Dev

クライアントブラウザからサーバーへのウェブサイトの複数画像アップロードを高速化

分類Dev

サーバーのバックアップスクリプト

分類Dev

PythonマルチスレッドサーバーとAndroidクライアントとの非同期WebSocket通信

分類Dev

Androidアプリからサーバーに複数の画像をアップロードする

分類Dev

Gitのセットアップ。ライブサーバーからローカルサーバーへのリポジトリのクローン作成

分類Dev

Amazon lambdaでは、複数のサムネイルサイズを並行してサイズ変更すると、非同期がスローされますエラー:ストリームが空のバッファーを生成します

分類Dev

サーバーでのスレッド化と非同期プログラミングの使用

分類Dev

複数のアプリケーションとポートを備えたGCPロードバランサー

分類Dev

PythonTCPリレー/プロキシサーバーのロックアップ

分類Dev

同じポートをリッスンしているNginxの複数のサーバーブロック

分類Dev

TCPを介して非同期的にサーバーと通信する複数のIOTデバイス

分類Dev

ループと複数のHTTPおよび非同期SQSを持つSpringIntegrationブロックフロー

分類Dev

FTPサーバーに複数の画像をアップロードするときのFileNotFoundException

分類Dev

サードパーティライブラリの非同期コールバックからAngularJSスコープを更新します

分類Dev

セイバーエアサーチとブックフロー

Related 関連記事

  1. 1

    複数のサーバーのRsyncバックアップスクリプト

  2. 2

    アウトバーンサブスクリプションからのメッセージを非同期で非ブロッキングで処理します

  3. 3

    アプリサーバーとLoRaWANベースのセンサーネットワーク間の双方向非同期通信

  4. 4

    TCPIP非同期サーバー接続のドロップアウト

  5. 5

    複数のクライアントを持つ非同期ソケットサーバー

  6. 6

    複数のアプリケーション間で同期するApacheロードバランサーデータ

  7. 7

    複数のJVMと単一のアプリサーバー

  8. 8

    カラーバーと複数のサブプロットの問題

  9. 9

    サーバーアプリケーションでの同期-非同期-マルチスレッド

  10. 10

    C#Mysql-非同期待機サーバーのデータベースクエリでのロックの使用

  11. 11

    RxPy:外部コールバックからホットオブザーバブルを作成し、複数の非同期プロセスをサブスクライブする方法は?

  12. 12

    gRPCcpp非同期サーバーと同期サーバー

  13. 13

    RxSwiftを使用した非同期タスクと複数のオブザーバー

  14. 14

    GWT-サーバー側の同期ブロック

  15. 15

    クライアントブラウザからサーバーへのウェブサイトの複数画像アップロードを高速化

  16. 16

    サーバーのバックアップスクリプト

  17. 17

    PythonマルチスレッドサーバーとAndroidクライアントとの非同期WebSocket通信

  18. 18

    Androidアプリからサーバーに複数の画像をアップロードする

  19. 19

    Gitのセットアップ。ライブサーバーからローカルサーバーへのリポジトリのクローン作成

  20. 20

    Amazon lambdaでは、複数のサムネイルサイズを並行してサイズ変更すると、非同期がスローされますエラー:ストリームが空のバッファーを生成します

  21. 21

    サーバーでのスレッド化と非同期プログラミングの使用

  22. 22

    複数のアプリケーションとポートを備えたGCPロードバランサー

  23. 23

    PythonTCPリレー/プロキシサーバーのロックアップ

  24. 24

    同じポートをリッスンしているNginxの複数のサーバーブロック

  25. 25

    TCPを介して非同期的にサーバーと通信する複数のIOTデバイス

  26. 26

    ループと複数のHTTPおよび非同期SQSを持つSpringIntegrationブロックフロー

  27. 27

    FTPサーバーに複数の画像をアップロードするときのFileNotFoundException

  28. 28

    サードパーティライブラリの非同期コールバックからAngularJSスコープを更新します

  29. 29

    セイバーエアサーチとブックフロー

ホットタグ

アーカイブ