私はウェブサイトを構築しようとしています(実際には商用スタートアップになるでしょう)私は this の質問を見ました、そしてそれは本当にいくつかに光を当てました私が理解したいと思っていたこと(opへのkudos)。それを見た後、ウェブサイトが実際に1日あたり数百万のヒットを必要としない限り、サーバー側でC++バックエンドを作成することは実行可能なソリューションではないことは理にかなっています。
しかし、これは私に考えさせました。
将来の(ありそうもない)イベントで、そのルートに行くとしたらどうでしょうか?問題は、これをすべて.Netを使用して(最初は)始めて、(学習の面で)多くの手間をかけずにすばやく簡単に何かを取得し、次にもっとオープンソースに移行することを考えていることです(Python/DjangoやRoRなど)後でお金を節約してOSSをサポートするために、ウェブサイトが実際に大きくなるのではないかと思います。C++バックエンドを統合し、Python強力な基盤のためのC++の上に、そしてバックエンドの基盤の上にあるHTML/CSS/AJAX/etcを軽減しますか?私が知りたいのは、状況を考えると、これが発生した場合、アーキテクチャの観点からは適切なアプローチでしょうか?Webサイトを実装するための優れた方法のように思われるため、MVCを確実にサポートします。
全体として、これは合理的であると考えますか、それとも他の選択肢がありますか?私は.Netが好きで、最初はそれを使いたいと思っています。なぜなら、たとえばPythonよりもはるかに多くの経験があるからです。 =またはPHPで、一般的にはそれが好きですが、将来的にはOSSをサポートしたいと思っています。私が探している文は「これは実用的ですか?」
いいえ、垂直方向よりも水平方向にスケーリングする方が効果的です
つまり、それほど強力ではない多数のマシンにリクエストを分散できるアーキテクチャを設計することをお勧めします。対照的に、低レベルで最適化されたコードを実行する1つの非常に強力なマシンを構築します。
水平スケーリングの背後にある推進力は、ウェブの「性質」によるものです。ウェブサイトは非常にIO重い計算ではない重い。YouTubeのように大量のデータをエンコードしているが、計算ノードと効果的なタスク管理を設定することで対処できる例外があります。システム。
たとえば、コンテンツをフェッチするために着信要求を他のサーバーに配布するだけのリバースプロキシサーバーを実装できます。リクエストの共通のオリジンが存在する限り(さらに、高度なDNSを使用して拡張できる場合でも)、データがどこから返されるかは問題ではありません。
少なくとも、「データ層」(データベースなど)を「Web層」(httpサーバー)から分割するのが一般的です。 StackOverflowでさえ、「Webレイヤー」にC#を実装し、データベースにアクセスするための別個のREST API(C#?))を実装することで、2つを明確に分離しています。
Cの生の計算能力を利用する必要がある場合でも、 pythonにはC/C++拡張機能を実装するための組み込み機能があります のような多くの「接着剤言語」があります。
スケーラビリティの分野では多くの画期的なことが行われていますが、幸いなことに、新しい分野を開拓している人々は、アプローチの詳細を共有したいと思っています。
基本的に、それは次のようになります。
Webに関しては、アーキテクチャが生のコンピューティング能力よりも優れています
HighScalibility.com は、スケーラブルなアーキテクチャ開発について読むのに私のお気に入りのサイトですが、Webには他にもたくさんあります。
脇:
Webリクエストを処理する際の最大のボトルネックの1つは、HTTPサーバーのアーキテクチャです。 Apacheのような従来のサーバーは、すべてのリクエストに対してサブプロセスをフォークします。動作しますが、スタックに追加されるすべてのサブプロセスには独自のメモリプールが必要であり、サーバー上の全体的なタスク切り替えのオーバーヘッドが必然的に増加します。
DDOS攻撃は、HTTPサーバーを過負荷にして、物理的に負荷を処理できなくなり、クラッシュすることで、この弱点を利用するように指示されます。
マルチスレッドは一時的な対策として導入されましたが、「優れた」マルチスレッドソフトウェアを作成することは記述が難しく、マルチスレッドのバグを特定することは非常に困難です。
最近人気が高まっているもう1つの「思考の学校」は、 イベント駆動型 Webサーバー Node.js や nginx などです。それらは、より単純なシングルスレッドモデルと、ファイアアンドフォーゲットモデルを実装することによって関数の戻りを待つことを軽減するプログラミングスタイルに依存しています。このような方法でプログラミングするのはより困難ですが、重い計算タスクがそれに特化したサーバーに渡される限り、それらが処理できる数(つまり、ヒット/秒)は(コモディティハードウェアでも)印象的です。
Facebookに聞いた方がいいかもしれませんが、彼らはあなたと同じ問題を抱えていました-彼らはPHPサイトをすばやく簡単にできると思っていましたが、大きくなると管理するために何かをしなければなりませんでしたスケーラビリティの問題。
彼らの例から学んだら、初日からC++バージョンに直接移行して、すべてを書き直す手間を省く必要があります。ただし、必要になることを前提として、多くのサイトはPerlまたはPHPコードで問題なく動作します。
Webコードの記述は非常に簡単です。要求を取得して処理し、返すHTMLコードを生成するだけです。他の言語が提供するフレームワークは、標準のXML(JSONを忘れないでください)とHTTPプロトコルビットの操作を簡単にするだけです-これらの機能を提供するC++フレームワークまたはライブラリがいくつかあるため、問題はそれらを統合することの1つになりますあなたのコード。
あなたができる最善のことは、コードをウェブサーバーから分離することです。私が非常に大規模なウェブサイトベースのシステムを持っている会社で働いていたとき、私たちはアプリケーションサーバー、ウェブサーバーで実行されるサービスですべてのビジネスロジックコードを書きました関連するコードは、サーバーの静的データ(画像とcss)と、サービスに要求を渡すためにほとんど存在していました。これにより、大幅に拡張できます。 IMHO Webサーバーは、ビジネスロジックを固定する場所ではなく、プレゼンテーション層の一部と見なす必要があります。これは、Webサーバーがハッキングできないことで悪名高いため、より強力なセキュリティが必要な場合に特に当てはまります。
更新:この質問も確認してください: Cおよび/またはC++はWeb開発のための実行可能/実用的なオプションですか?
エネルギーと必要なインフラストラクチャの両方に影響を与えるプロジェクトにC++を使用すると、両方が大幅に削減される可能性があるため、実用的だと思います(Faccebookのヒップホップを確認してください: http://developers.facebook。 com/blog/post/2010/02/02/hiphop-for-php--move-fast / PHPをC++に変換するだけで、サーバーの使用量を半分に減らしました。
プロジェクトの主なボトルネックに依存すると思います。開発者の生産性ORアプリケーションの効率ですか?2番目の場合は、 [〜#〜 ] cppcms [〜#〜] :
CppCMSを使用する必要がある場合
C++言語は、適切なツールの欠如、開発者のスキルなど、多くの理由でWeb開発に普及しているとは言えません。
ただし、CppCMSを使用したC++ Webプログラミングが非常に便利で効率的になる領域もあれば、時間の無駄になる領域もあります。
CppCMSを使用する必要がある、または使用できるのはいつですか?
高いパフォーマンス、効率、スケーラビリティが要求される、毎秒数百、数千のヒットを伴う高負荷のWebサイトとアプリケーション。スケーラブルなComet/Server Push(1)テクノロジーを必要とするアプリケーション--- CppCMSは、最小限のリソース使用量で数百、数千の同時HTTP接続を効率的に処理できます。わずかな追加ライブラリのコストで、既存のC++アプリケーション/サービスにWebインターフェイス(2)を埋め込みます。組み込みのパワー不足のデバイス-CppCMSを使用すると、ハードウェアのコストを比較的低く抑えて、適度に高速に実行できるリッチアプリケーションを作成できます。使用しない場合は?
高負荷を必要とせず、市場投入までの期間が非常に短い小さなWebアプリケーションを作成する場合は、おそらくDjangoまたはRoRなどのツールがそのようなタスクに適しています。
(1)今後のCppCMS1.xで利用可能です。 (2)現在のバージョンのCppCMS(0.0.x)は、既存のアプリケーションにWebインターフェースを埋め込むために使用できますが、次のバージョン1.xはそれをはるかによくサポートします。
すべてのWebサイトでC++(または同様の)言語が使用された場合、インターネットはより高速で応答性が高く、エネルギーとメモリのコストが低くなります。しかし現実的には、すべてのWebプロジェクトが作業の優先順位付けの主なボトルネックとして効率性を備えているわけではありません。そうは言っても、私たちがこのように行こうとすると、私たちの惑星の熱を減らすのに役立つかもしれません...
Stackoverflow自体は純粋なC#/。netサイトであり、それほど悪くはないようです。
Facebookは、最初の10億を達成した後、C++でいくつかの重要な部分を書き直すことを決定した可能性があります。彼らがC++で書き始めていたら、最初の10億を手に入れることはできなかったと思います。
LAMPスタック(および.NET)を使用すると、ものをすばやく開発できるため、新しいアイデアを自由に試したり、うまくいかなかった古いアイデアをすばやく破棄したりできます。
Facebookの要点はユーザーエクスペリエンスでした。文字列クラスのメモリ割り当てをいじっている間は、外観や使いやすさについては考えません。
私はそうは思いません。
C++は常にOSとドライバーの開発にその役割を果たしますが、Webアプリケーションに関する限り、ボトルネックがそれを実行しているサーバーになることはめったにありません。それはすべてネットワーク帯域幅と、クライアントマシンが更新された情報を見るのにかかる時間にあります。
サーバーは長い道のりを歩んできており、ガベージ言語を実行する能力は十分にあります[私は指を指さないでしょう。あなたはあなたが誰であるかを知っています]クライアントがパフォーマンスのヒットに気付くことさえありません。
PHPは、多くのWebアプリケーションに適しているようです。また、最新のWebおよび最新のコンピューターの新機能のいくつかにより、(許可するのではなく、より多くの処理をクライアントマシンにプッシュすることもますます一般的になっています。サーバーがすべてを管理します)。
サーバー上でC++を使用することもできますが、CGIスクリプトをより現代的でコーディングしやすい言語で作成する方が簡単な場合もあります。