web-dev-qa-db-ja.com

高性能Webサービスにはどのプログラミング言語を選択する必要がありますか?

アプリケーション用のWebサービスAPIを構築中です。また、RESTとSOAPの両方を介してサービスを公開することを計画しています。

サービスを実装するためにどのプログラミング言語を選択すべきかについて、コミュニティからフィードバックを得ることに興味がありますか? (私はC#、JavaおよびRuby-サービスを作成するのに十分なRoRを知っています)。

このサービスは主にHTTP POSTサービスです。約2000の同時接続を処理する必要があり、1秒あたり約10,000のHTTP POSTを処理できる必要があります。(for SOAPクライアントが呼び出すsubmitメソッドがあります)。

サービスは、POST要求に対してクライアントに応答を返しません。

どのプログラミング言語/アーキテクチャを使用すべきかについてのアイデアはありますか?

16
Ray Dookie

1秒あたり10,000リクエストは、1か月あたり250億ヒットです。これは、次の2つのいずれかを意味します。

  1. あなたのアプリケーションはMySpaceよりも人気があります。または
  2. これを使用して、制御する2つのveryおしゃべりなコンポーネント間で通信しようとしています。 貧しい 恐ろしいデザインの選択。

Webフロントエンドのファーム全体にその量の負荷を分散するためのスイッチングハードウェアだけでも、数千ドルのコストがかかります。

1秒あたり50件のリクエストを処理できるWebサービスを作成することから始めます(言語の選択はそれほど重要ではありません)。アプリケーションが非常に混雑していて定期的にそのしきい値を超えている場合は、スケーリングの問題にフルタイムで取り組むために誰かを雇う余裕があり、無料のQ&Aサイトで助けを求める必要はありません。

50
Rex M

私の以前の経験に基づいて、私はあなたに以下のアドバイスを与えることができます。

  1. あなた(そしておそらく他のチームメンバー)が最も好きな言語を選んでください。ハードウェアは高速で安価なので、高級言語を好みますが、プログラマーは遅くて高価です。
  2. 完全にステートフリー(セッションなし!)になるようにサービスを設計します。これにより、サービスのさまざまなインスタンスが相互に認識している必要がないため、新しいハードウェアを簡単に追加できます。
  3. 処理を非同期で処理します。幸い、クライアントに応答を返す必要はありません(OK以外)。同期的に実行すると、プロセスがブロックされ、リクエストレートが低下します。良い読み物は このウィキペディアの記事 、そして特に(古典的です!)C10K問題です。
  4. サービスを多くのマシンに配置します。(サービスの速度によって異なります)
  5. データベースサーバーをWebサービス以外のマシンに配置します。高速ディスクを使用してください!
  6. 次のようなものでバランスをとって負荷を処理します:
    • Linux Virtual Server 、カーネルで実行されるため、最もパフォーマンスの高いソリューションです。狂ったようにスケーリングします。私はそれを2003年に0.1%のCPU負荷でP3/1GHzで約500req /秒で使用しました。ペアにして [〜#〜] ha [〜#〜] を達成できます。 1台のマシンで10000req /秒を非常にうまく処理する必要があります。もっと簡単なことを試した後、これを行ってください。これは非常に難しい場合があります。アップデート2018:現在、これはメインラインカーネルに統合されているため、すべてのディストリビューションでこれをパッケージとして持つ必要があります。
    • Nginx 、簡単な構成、非常にパフォーマンスが高い。 SSLを実行できます。 HTTPサーバーとしても機能し、サービスのパフォーマンスの高いホスティングソリューションになる可能性があります。
    • Varnish 、複数のバックエンドを処理できるHTTPキャッシュ。非常に構成可能ですがSSLを実行できないため、トラフィックを暗号化する場合は、その前にNginxが必要になります。
    • ポンド 、セットアップは非常に簡単ですが、オーバーヘッドが高くなります。良い出発点。 SSLを実行できます。 2011年以降プロジェクトは終了しました。
    • Perlbal 、使用したことはありませんが、良いことを聞いています。 2013年以降プロジェクトは終了しました。
    • またはその他 リバースプロキシ
27
pi.

毎秒10,000の投稿で、言語はあなたの心配の最も少ないです。はるかに大きな問題は、サーバーファームとネットワークの設計です。これを1つのボックスで実行する予定はないと思いますか?

13
Jason

高度にスケーラブルなアプリケーション、信頼性が高く、分散型で、マルチコア/マルチプロセッサシステムを使用していますか?ここで私はすぐにErlang/OTPとYawsをWebアプリケーションサーバーとして考えます。 Yawsは、非常に高い負荷の下で非常に安定して高速に動作します。そして、プラットフォームとしてのErlang/OTPは、安定したソフトウェアの開発を支援するいくつかのメカニズムとともに、並行性と配布のために設計されています。コスト:関数型プログラミング言語を使用した並行性指向はありませんOOP with JavaまたはC#、構文は奇妙に見えます(ただし、一度実行すると非常に単純で強力です) 'それを採用しました)、そしてサードパーティのライブラリの数は主流の言語ほど多くはありませんが、それだけの価値があります。

お役に立てれば

ミュー

11
themue

その速度で、とにかくHTTPを壊している(応答がない)ので、独自のサーバーを開発するか、オープンソースサーバーを変更することをお勧めします。

すべてをCまたはC++で記述すれば、できるだけ早く熱狂するでしょう。

ただし、スケーラビリティは言語の選択以上の影響を受けます。

-アダム

5
Adam Davis

1台のマシンから月に10億件の投稿を取得することがわかりました。現在、1日あたり約350万件の投稿を処理しているc#で記述されたWebサービスがあります。 Webサーバーは3%のCPU使用率で稼働しています。つまり、少なくとも20倍強く押すことができます...

各マシンに4つのXeonSixコア、32 GBのRAM、高速ディスクアレイ、および書き込み用に高度に最適化されたデータベースがあると仮定します。ただし、各サーバーのコストはおそらく35,000ドルから40,000ドルの範囲です。

とにかく、ボトルネックはC#やJavaではありません。それがどれだけ大きくなるかに応じて、それはデータベースサーバーになります。私の場合、1日あたり10GBが削除され、10GBが追加される約300GBです。

4
NotMe

問題を見てみましょう:

IO:これは簡単にシステムの最大のボトルネックになります。ホストOSとの最適な統合を提供し、非ブロッキングの高度なセマンティクスを提供し、オプションで同時実行をサポートする言語を選択してください。

データ:SOAP? XML? 最小化不要なCPUサイクルを実行する必要があります。 JSonを使用するだけの何が問題になっていますか? (そして、RESTアーキテクチャベースのサーバーはプロトコルでバイナリデータを使用できない...)という神の命令はありません。

内容:データの変換(たとえば、テキストから数値へ)が含まれる場合は、どの言語が最も効率的なメカニズムを提供するかも考慮する必要があります。例として、Java(これはあなたにとって非常に有力な候補です)では、Stringクラスは深刻なCPUの占有です。

JavaとErlangは非常に良い候補です。 Cは常にオプションですが、並行プログラミングははるかに困難です。

3
alphazero

CGI(Common Gateway Interface)を介して実際に任意の言語を使用できるため、パフォーマンスが低下します。あなたがリストする言語の中で、私はC#が最速であると期待しています。言語間の速度の良い比較は 言語シュートアウト

本当にパフォーマンスが必要な場合は、CやDなどのパフォーマンス指向の言語の方向に目を向けてリクエストを処理することをお勧めします。

それはすべて、各リクエストが実際に実行する必要のある計算の種類によって異なります。

2
Zuu

更新:それは火事であり、Webサービスを忘れることを意味します。簡単なHTTP200/OK応答を返送すると思います

いいえ、これは単一のボックスで実行することを意図したものではありません。いくつかのボックス(たとえば3-4)で実行することを目的としています。

リクエストが受信されると、他のマシンのキューにプッシュされ、HBase/Voldemortストアに取り込まれます。

私が言ったように、それは「ファイアアンドフォーゲット」ウェブサービスであることを意味しました

0
Ray Dookie

C llike言語が必要であり、完全なサーバーを作成しないようにするには、CGI(phpなどはすべて実行されます)WindowsサーバーはISAPIプラグインを提供しますが、これらはサーバーのコンテキストで実行されるため、メモリリークとGPFはサーバーを停止します。それに加えて、何かを変更するたびにサーバーを停止/起動するという不便さは、CGI/FastCGIの方が見栄えがします。

0
Mike Trader