スケーラブルなバックエンド インフラストラクチャを構築して、最終的には次のことを実行したいと考えているようです。
- コンテンツを提供します。これは Web サーバー層です。
- Web サーバー レイヤーから受信したユーザー リクエストに対してある種のバックエンド処理を実行し、データ ストアと通信します。これをアプリケーション サーバー層と呼びます。
- セッション状態とユーザー データを、分散されたフォールト トレラントな結果整合性のあるキー値ストアに保存します。
また、市販の PC ハードウェアを使用してこれを行いたいように思えます。
これは難しい注文です。
Foursquare は、Lift フレームワークで Scala を使用し、Web サーバーには jetty を使用しています。詳細はこちら。そしてもっと。
Facebook はさまざまなテクノロジーを使用しています。彼らのデータストアにはHBaseを使用していることを知っています(彼らはCassandraを使用していました)
Yahoo は HBase を使用してユーザー統計を追跡しています。
Twitter は、Ruby バックエンド Web サイトとして始まりました。彼らは Scala に移行しました。Twitterは、独自の増分データベース変換ツールを使用して、mysql (シャードされていると思います) から Cassandra に段階的に移行しています。
アプリケーション サーバーと Web サーバー エンドでのスケーリングに関する限り、本当に重要なのは、ユーザー空間で新しいユーザー プロセスを生成する機能を持つ言語と、入ってくる要求を新しいワーカー プロセスに割り当てるマネージャー プロセスを持つことです。考えてみてください。非常に効率的な会社を運営しているとして。仕事が増えれば増えるほど、より多くの人を雇うことができます。これが アクターモデルです。アクターが組み込まれている言語 (erlang) や、フレームワーク (akka) またはライブラリー (Scala ネイティブ) としてアクターが実装されている言語もあります。どうやら、Scala のネイティブ アクターにはバグがあるようです。そのため、何人かの人々が集まって、Scala と Java の akka フレームワークを実装しました。アクターと、どの言語とライブラリを使用すべきかについて、オンラインで多くの議論があります。Erlang はすぐに使用できるように多くの機能を備えていますが、Scala は JVM で実行され、既存の Java Web ライブラリの多くを再利用できます (静的オブジェクトが宣言されている場合、問題が発生する可能性があります)。にはアクターと OTP ライブラリがありますが、明らかに Java が持つ豊富なライブラリはありません。つまり、私にとっては、Scala (akka を使用) または Erlang に要約されます。
Web サーバーの場合、Scala を使用すると、任意の Java アプリケーション サーバーを使用できます。Foursquare は、ほとんどのものに桟橋を使用しています。これは Scala で書かれていませんが、Scala は JVM で実行されるバイトコードにコンパイルされるため、任意の Java アプリ サーバーと簡単に相互運用できます。
また、Erlang プログラマーはそれほど多くなく、Erlang は習得が難しい (関数型プログラミングvs命令型プログラミング) とも言われています。Scala は関数型であると同時に命令型でもあります (つまり、どちらでも可能です)。
Erlang は機能的です。現在、関数型プログラミングには、熟練した関数型プログラマーが熟練した命令型プログラマーよりも多くのことを行うことができるため、多くのことが行われています。 Yahoo ストアは、もともと Lisp (関数型言語) で 1 人の男性によって作成および保守されていました。一方、命令型プログラミングは習得が容易で、チーム環境で広く使用されています。命令型言語はあるものには適していますが、他のものには関数型言語が適しています。適切な仕事のための適切なツール。
Web サーバーの議論に戻ると、Erlang を使用すると、yaws を使用したり、フレームワークを実行したりできます (Chicago Boss)
Scala と Erlang の議論についてはこちら。
別のリンク。
詳細はこちら。
そしてもう一つ。
別の意見。
データベース側には、多くの選択肢があります。こちらをご覧ください。
データベースを完全に避けて、データを mnesia (Erlang のランタイム データ ストア) に保存することもできます。
このトピック (アプリ サーバー、データベース、および Web サーバーのスケーリング) は非常に複雑で、議論に満ちているため、私の回答は完全ではありません。一部のフレームワークは、層 (Web サーバー、アプリケーション サーバー、データベース) の区別をあいまいにし、これらの層の多くの機能をフレームワーク自体に統合しています。