8

スタンドアロン ソリューションからSoftware as a Serviceへの有機的な成長プロセスはどのようなものですか? 明らかに

スケーラビリティは、開発の最後に追加される「機能」ではありません。^

そのため、必要な高レベルのコードとアーキテクチャの変更に興味があります。

  • 既存のプラットフォームを選択して、それを過度に正規化しますか?

  • 必要最小限のクラウド アーキテクチャからやり直してから、レガシー機能を移行しますか?

  • 積極的なテクノロジーのアップグレード (つまり、Web フォーム > MVC) はプロセスに適合しますか?

アップデート:

現在のプロジェクト アーキテクチャについて説明を求められました。詳細は省きますが、ビジネス ロジックのレイヤーにプラグインし、複数のサードパーティ ベンダーと統合する .NET Web フォーム アプリケーションについて考えてみてください。新しいプラットフォーム インスタンスが必要になるたびに (ここでは用語が不足しています。つまり、新しいクライアントがビジネス ロジックの調整、さまざまなサードパーティ プロバイダーとの統合、ホットな新しいブランディングなどを必要とする場合)、既存のコードが分岐され、新しい環境が使用されます。設定。変更が aspx ファイル、コンポーネント コード、または db 構成で直接発生するかどうかに関係なく、事実上非常に低レベルです。

このシナリオは、「適切な」SaaS モデルを実装するのに完全に適しているように見えますが、移行プロセスに建設的に貢献するのは困難です。尋ねられた元の質問を言い換えると、これに従うのが効率的な戦略になります。

  • 既存のプラットフォームを過度に正規化し、すべてを構成可能にして、このシミュレートされたスケーラビリティを効果的に中断し、アーキテクチャがリファクタリングされるまで新しいクライアントを導入しません。この印象のマイナス面は、スケーラビリティのために構築されていないコードと構造に依存し続けていることです (詳細は後述)。

  • 今後のソリューションに(主観的に) 最適なアーキテクチャと見なされるものは何でもゼロから開始し、必要に応じてレガシー機能を移行します。これにより、ほぼすべての必要なテクノロジーのアップグレードが可能になりますが、完了するまで可視性が欠けており、積極的な変更であるため、経営陣は本質的にリスクが高いと見なします。

個人的には、大量のレガシー コードが存在し、データベースの正規化が十分に行われていないため、2 番目のオプションに傾いています。同時に、既存のソリューションは成熟して機能しており (壊れていない場合は修正しないでください)、上に挙げた 2 つのアプローチ以外にも、スケーリングする方法が他にもたくさんあると思われます。

上記のコンテキストでシナリオ固有のアドバイスが可能であれば、私はそれを受け入れます。しかし、私はまだ、より一般的な「すべきこと」と「すべきでないこと」、およびより多くの聴衆に適した指針を受け入れています。

4

5 に答える 5

4

非常に短い答え

その鍵は建築です。方法は、分割して征服することです。アプローチはリラックスすることです。

もう少し長い答え

建築

建物の最も重要なコンポーネントは、そのアーキテクチャです。壁と床、窓と天井、つまり構造自体の要素で空間が形成される方法。建築家の目的は、壁を設計することではありません。彼は実際の仕事の副次的な部分としてそれらを設計します。つまり、壁によって形成される空間を設計します。私たちは壁を持つために建物を建てるのではなく、内部に空間を持つために建物を建てます。

私たちはまず、ソフトウェアに求める機能を設計します。次に、それを可能にするための詳細、つまり製品の構築について説明します。私たちが使用するテクノロジーは主なものではなく、壁であり、私たちが本当に求めているのは空間そのものです。

構築しているソフトウェアに何を求めているかをよく理解することで、エンジニアリングははるかに簡単になり、ほぼ自動化されたプロセスになります。技術的な問題は、よく理解された定義と幸いなことに明白な解決策とともに現れ始めます。

分割統治

優れたアーキテクチャの非常に重要な尺度の 1 つは、ソリューションのコンポーネントを明確に定義することです。全体像のこれらのコンポーネントを個別に見ることができれば、作業を別々の部分に分割できます。その後、別々のものを構築して連携させることができます。

リラックス

たぶん、このタイトルは、テキストにユーモアを加えようとしているように聞こえるかもしれません。いいえ、誤解しないでください。優れたアーキテクチャがあれば、Web サーバー、データベース サーバー、エンジニア、顧客、ユーザー、その他の世界もリラックスできます。そうでない場合は、アーキテクチャの作業に戻る必要があります。

は?

ねえ、私はここで何について話しているのですか?それはいくつかの段落と 3 つのタイトルであり、ソフトウェア以外のソフトウェア用語は 1 つも使用しませんでし。このような抽象的なおしゃべりは、一日中何もすることがなく、怠惰に歩き回り、話し、話し、話している人のためのものです... 私たちはソフトウェアの人々であり、これを行う時間がありません。ねえ、ハサン、短くして..!

わかりました、試してみます。しかし、まずはリラックスしましょう...それから、いくつかの実際の例を見てみましょう。

専門家および個人向けの Web パブリッシング サービスを開発しているとしましょう。すべてのクライアントは、当社のシステムで実行される独自の Web サイトを持ちます。これらの Web サイトは、訪問者の数が非常に少ない通常の個人の Web サイトである場合もあれば、当社のビジネスが運が良ければ、他のクライアントの一部が NY Times のような大規模な出版物である場合もあります。

2 種類のスケーラビリティの問題を解決する必要があります。1 つは、ますます多くのクライアントを持ち、より多くの Web サイトを運営するようになるにつれて、ビジネスとシステムをスケーリングすることです。これは、2 つ目の問題に比べて非常に簡単な問題です。2 つ目の問題は、単一の Web サイトをスケーリングして、より多くの訪問者、より多くのデータ、このデータで実行するアプリケーションを増やしていくというものです。

「どのようにスケーリングするか」という問題を「どのように分割するか」と書き直して、解をより明確に見ることができます。何かを小さな断片に分割できれば、それらの断片を実行するためのリソースを追加して水平方向に拡張することで、スケーリングできます。

データと、そのデータを処理するアプリケーションが用意されます。1 つのデータベース サーバーと 1 つの Web サーバーがあり、これをスケーラブルにしようとしているとします。

サービスのために実行する Web サーバーについて考えます。これらのマシンにデータを保持しない場合、それらは一般的で同等のコンポーネントになり、このデータを他の世界とやり取りするデータ バックエンドの小さなクライアントになります。Web サーバーを軽く、愚かで、空にしておくことで、増え続けるリクエストを簡単に処理できるようにすることができます。

わかりました、Web サーバーをただのばかげたプロキシに変えることは、最も賢明な考えではありません。私たちは何かをする必要があり、アプリケーションを実行する必要があります。また、私たちのアーキテクチャでは Web サーバーが最も簡単に増殖できるため、これらの Web サーバーでできるだけ多くのことを実行したいと考えています。この難しい問題については、以下の「Dividing Smarter」というタイトルで続けます。その前に、現在検討中のアーキテクチャの種類と、それがどのように拡張可能かを見てみましょう。

ロード バランサーを使用して、多くの Web サーバーを並行して実行し、DNS を使用して (要求がシステムに到達する前であっても) 複数のロード バランサーに多くの Web サイトをグループに分割します。たとえば、a.com、b.com、c.com からロード バランサー 1、a-very-big-website.com からロード バランサー 2、... ロード バランサーの各グループ、一連の Web サーバー、およびデータベースサーバーは、システム内に別の宇宙を作ります。今では、数百万の Web サイトを所有し、これらの個別のユニバースを無制限に追加することでシステムを拡張できます。当社のマーケティング部門が提供できる数の Web サイトで、多くのクライアントにサービスを提供できます。最初の問題はすでに解決されています。大きな大きなウェブサイトを運営するのはどうですか?

分割をよりスマートに

もちろん、個別の Web サイトの場合のように、単一の Web サイトを個別の宇宙に分割することはできません。しかし、これは私たちが何も分割できないという意味ではありません。分裂と征服を続けていきます。これを行うには、解決する問題を詳しく調べる必要があります。

ウェブサイトとは?Web ページ、ファイルなどのサポート コンテンツ、画像cssjsビデオ ファイルなどのマルチメディア コンテンツ、データ、大量のデータ。クラウド コンピューティング システムが提供する CDN と優れたストレージ サービスのおかげで、静的ファイルはもはや私たちの問題の重要な部分ではありません...

私たちが実際に行っているのは、Web ページのレンダリングです。上記では、Web サーバーを、データベース バックエンドへの非常に軽量で汎用的なインターフェイスと考えていました。ユニバースでアプリケーションを実行する方法はまだ解決していません。今こそそれを行う時です。

当社のシステムへのすべてのリクエストはサイトに届き、そのサイトで実行されているアプリケーションによって処理されます。Web サーバーが最初に行うことは、リクエストがどのサイトに属しているかを判断することです。私たちのデータベース サーバーでは、ホスト名とサイトを照合するテーブルを保持しています。新しいクライアントの Web サイトがあるたびに、このサイトと一致するように、このテーブルに 1 つ以上のドメインを追加します。Web サーバーへのすべてのリクエストで、データベース サーバーにクエリを実行し、ロードするサイトを決定します。良い?

いいえ、良くありません。それはひどいです。なんで?

大きな数、小さな数

少数のウェブサイトがあります。しかし、非常に多くのリクエストがあります。ユニバース上の Web サイトの数は、ブログ サイトのコメントなどの他の種類のデータよりも頻繁に変化しません。このテーブルは、確立されたユニバースで 1 日に数回更新されます。このような小さな (数千のレコード、小さな!) データベースに対して、すべてのリクエストに対して 1 日中何度もクエリを実行するのは賢明ではありません。これを行う賢明な方法は、このテーブルのコピーを Web サーバーに保持し、更新されたときにのみ更新することです。サイト リストが更新されたことをどのように知ることができますか? テーブルのバージョン番号として番号を持つ行を保持できます。更新ごとに、この数を増やすことができます。または、最終更新のタイム スタンプを保持することもできます。Web サーバーは、データベース サーバーでこの番号を確認し、それをローカルのメモリ内バージョンと比較できます。テーブルが新しい場合、ローカルのメモリ内コピーを上書きして、データを再度プルします。このようにして、数千のクエリを小さな数に減らすことができます。大きな数、小さな数...

この時点で、建物に使用する材料が重要になり始めました。どの言語、どのような種類のプラットフォームとデータベース システムなどです。現在、それらはアーキテクチャの動作を改善または悪化させる可能性があるため、重要です。たとえば、テーブルの更新の場合、データベース サーバーは更新について Web サーバーに通知するメカニズムを持つことができます。このようにして、さらに進んで、ドメイン サイト テーブルの不要なクエリを完全に削除します。したがって、選択したシステムがそのようなメカニズムを提供する場合、これらのシステムがアーキテクチャに適していることを意味します。

ソフトウェアに何を求めているかをよく理解していれば、スマートな方法で物事を分割することが自動的に行われます。データベース サーバーのスケーリングは非常に困難です。一緒にいるにはデータが必要なので。Web サーバーの数を増やすことで、制限なく水平方向にスケーリングします。ただし、データベース サーバーの場合、これは適用されません。データベースサーバーはデータへのアクセスを維持する必要があり、マシンには効率的な方法でスケーリングできない制限があります。

すべてのデータベース システムは、シャーディングやシェアード ナッシング アーキテクチャなどのスケーリング方法を提供します。これらを使用しなければならない場合があります。しかし、フォーラム、ブログ、および他の場所で人々が経験を共有しているのを見ると、私見ですが、人々はこれらをあまりにも積極的かつ間違って使用しています. 彼らはデータベースをどんどん大きくしていき、「スケールする時が来ました。いくつかのシャードを追加しましょう」と言いました。これらすべてのアプリケーションの 99% はブラインド ランニングです。人々は問題をソフトウェアに任せ、魔法のように解決されることを期待します。残念ながら、彼らは魔法がないことにすぐに気付きます。

数値に注意して、盲目的な解決策から身を守る必要があります。大きな数、小さな数です。また、システムの内部の仕組みを理解し、材料を多用するのではなく、建築を通じて問題を解決することによっても。

ここにアーキテクチャ ソリューションがあります: Architected Solution ( Calatravaによる)。

優れたアーキテクチャではなく、材料に依存するその他のソリューションを次に示します。[ブラインドラン ソリューション 1 ]、[ブラインドラン ソリューション 2 ]

違いは自分で判断してください。

データベース サーバーをどのようにスケーリングできますか? テーブルを途中でやみくもに分割する代わりに、データについて再考することができます。ユーザー アカウント情報をサイト テンプレートから分離できますか? もちろん、なぜですか?古いデータと新しいデータ用に別のデータベース サーバーを保持することはできますか? 特に検索機能を考慮すると、もう少し難しいです。しかし、なぜですか?

やみくもにではなく、賢く分けましょう!もう分割できない場合があることは承知しています。でもさあ、私たちの何人が Google や Facebook で働いているでしょうか?

-- やあ、非常に大きなデータ セットがあり、実行すると...

――シュッ。まず、戻ってデータセットを確認します。それは本当に大きなデータセットである必要がありますか?

ほとんどの場合、そうではありません。私たちはそれを認めたくないだけです...

移行方法

すべてをゼロから再構築するには時間がかかり、多くの企業では余裕がありません。より良い方法は、すべてのコンポーネントを書き直さずに現在のシステムを構築することです。代わりに、それらをコンポーネントとして分離して再定義します。これは主に分析であり、その後に小さな変更が加えられます。システム上のすべての関数呼び出しは、簡単に分岐点になる可能性があります。その時点から、システムを 2 つの部分に分けることができます。

ほんの数時間、現在のシステムを楽しく見てみるだけで、それらのピースを分割する方法について多くのアイデアが得られます。それらを分割したら、すべてを再構築して新しいシステムを少しずつ再構築するのは非常に簡単です。私が建物を持っていて、同じ土地にもっと大きな建物が必要な場合、すでにそこに住んでいるすべての人々を移動させずに新しい建物を建設するのは非常に難しい仕事です。しかし、不可能ではありません。建物ではなくソフトウェアに関しては、はるかに簡単です。そう?

リラックス

ソフトウェアです。柔らかいです。データをコピーし、テストを行い、すべてを削除し、さらに 100 万回コピーできます。アーキテクチャが適切に設計されていれば、ミスによって壊滅的な事態が発生することはありません。6 人掛けのディナー テーブルを 60 人のゲストに提供できるテーブルに変えるのは非常に困難です。しかし、ソフトウェアは...ソフトウェアであり、私たちはそのようなことを簡単に行うことができます. リラックス。

-- 上記の質問は、ほんの数段落でカバーするのが不可能な領域に触れています。質問のこの部分に基づいています。詳細に飛び込むことなく、一般的な形式で物事を言及しようとしました. 私の原則の実践的な応用例をいくつか挙げようとしましたが、この短いテキストには多くの未解決の点が残されていることを知っています。コメントでの批判や質問に感謝します。

于 2012-07-06T21:17:44.027 に答える
3
I'm interested in high level code and architecture changes required.

残念ながら、アーキテクチャを変更する方法について「正しい」答えはありません。解決策は、現在のアーキテクチャがどのように見えるか、および開発者としての能力と好みによって異なります。スタンドアロン システムの中には、比較的スケーラブルなプラットフォームを既に持っているものもあれば、勢いを増し始めると改善が必要になるものもあれば、コード ベースが使用できないために最初からやり直す必要があるものもあります。

しっかりしたコードベースは非常に重要です。効率的でクリーンなコード ベースがなければ、アーキテクチャが適切に拡張されることはまずありません。多くの企業は、短期的な問題を解決するためにバンドエイドを重ねるという過ちを犯していますが、長期的には、これは決してうまくいきません。何かがうまくいかない場合は、時間を取って、可能な限り最も論理的な方法で修正してください。それがプラットフォームの他のコードを調整することになるとしてもです。

最善の方法は、スケーラブルなシステムの構築に関する一般的なアドバイスを提供することです。つまり、キャッシングを使用する、システムを水平方向にスケーリングするように設計する、データベースを最適化する、必要に応じて db インデックスを使用するようにするなどです。一部のベスト プラクティスはアーキテクチャに依存しますが、ほぼすべてのスケーラブルなプラットフォームが従う必要のある一般原則がいくつかあります。スケーラビリティの優れたテクニックとデザイン パターンの詳細については、Scalability Rules: 50 Principles For Scaling Websitesを参照してください。

プラットフォームの選択に関する限り、それは完全に開発者としてのあなたとあなたの好み次第です。何をコーディングするのが好きですか? C#、Ruby、PHP? チームが同意する言語とプラットフォームを使用してください。私は Ruby on Rails の方が好きで、MVC 設計パターンも気に入っていますが、それが最適なソリューションであるとは限りません。自分にとって最も理にかなっているものを選び、それを使ってスケーラブルなシステムを開発してください。

これまで、高いスケーラビリティを必要とするシステムに取り組んでいると、最初からやり直さなければならなくなることがよくありました。残念ながら、誰もが必要なベスト プラクティスと機能をすべて把握しているわけではなく、多くの場合、理想的とは言えないデータベースとプラットフォームの設計につながります。システムを開発するプロセスは、真に必要なものと、そのシステムに最適な方法論について多くの洞察を与えてくれます。このように、過去に製品の途中で新しいコード ベースの必要性に気付いたことが何度かありました。そのため、最初からやり直して、新しい設計に適していると思われるレガシー コードを移行しました。

于 2012-07-01T20:43:31.473 に答える
1

これを読んでください: http://static.usenix.org/event/lisa07/tech/full_papers/hamilton/hamilton_html/index.html

これにより、スケーラブルなシステムの構築に関する概要がよくわかります。ハードウェア/ソフトウェアの観点と、サーバーごとのヒューマン スケーリング エンジニアの観点の両方から。

The Lean Startup (Eric Ries)という本 (または kindle の本)にも、良いヒントがいくつかあります。

于 2012-07-11T23:22:34.570 に答える
1

私のケースは多少異なりますが、デスクトップから直接 SaaS に移行する 1 つのモデルになる可能性があります。私の会社はメディアモニタリングを行っています。最近、メディアがもはやテレビやラジオではないことを発見し、可能な限りネットからすべてのストリームをキャプチャするようになりました。クライアントに解決策を提供するために - 彼らはレコーダーではなくアーカイブを必要とします - 私たちは単に私たちのサーバーで彼らのためにホストされたソリューションを行います.

これにより、すべてを 1 つの屋根の下に置き、「クラウド HQ」でコード ベースを直接維持できるようになりました。

まだまだありますが、読者を退屈させるつもりはありません。私たちが強制したわけではないことを指摘しておきます。それは本当に有機的で、完全に正常なことでした。

私たちのソリューションのアーキテクチャは、システムに追加されたすべてのハードウェア ノードがネットワークからストレージ、CPU まで完全に利用されるという 1 つの大きな前提に従います。ソフトウェアのすべての部分は、個別に実行される「タスク サーバー」 <-> 「エージェント」として記述されます。そのため、いつでも追加のマシンを購入して、その時点で必要なものを実行できます。

于 2012-07-02T00:07:07.083 に答える
0

プロセスは基本的に、データとの対話に基づいてクライアント/サーバー インターフェイス (Web ベースの SAAS の場合は http) を作成します...

サーバー内のデータに直接アクセスできる場合は、ソフトウェア ソリューションのすべてまたは大部分を、asp.net、php、ruby+rails、python+django などの Web ベースのプラットフォームに移行できます。この代替手段では、JSON、oData、テキスト、コードへの埋め込み (オブジェクトまたは配列) など、いくつかの方法でデータを渡すことができます。この問題を克服するための非常に巧妙なソリューションがあります。一般に、AJAX とユビキタスな XMLHTTPRequest に関連しています。

使用しようとしているソフトウェアのコードさえ持っていないという極端なケースの場合は、実行可能ファイルしかない COBOL または同様のソリューションを想像してください...この極端なケースでも、から読み取るブローカーを作成できます。プログラムの画面 (auto-It で実行できます)、そのデータを Web インターフェースに渡し、クライアント エンドポイントで表示し、Web プログラムから結果を取得し、実行可能インターフェースに挿入します (auto-it も再度実行します)。または他のマクロ制御ライブラリ)。

MVC/MVVC/RAILS/DJANGO などを使用する必要はありませんが、データからアクションを分離し、Web プログラムの流れを制御する経験がある程度ない場合は、作業が楽になります。

于 2012-07-01T21:03:47.333 に答える