4

イェーイ、SO に初投稿!(よくやったジェフら)

ユーザーがオンデマンドでレポートを生成できるようにしたときに導入された Web アプリケーションの 1 つのボトルネックを解決しようとしています。

当社のインフラストラクチャは次のとおりです。 Web サーバー/DB サーバーとして機能する 1 台のサーバー (ColdFusion 7 および MSSQL 2005)

バックエンド ユーザー用の Web アプリケーションとフロントエンド Web サイトを提供しています。レポートはバックエンドからユーザーによって生成されるため、ユーザーがログインする必要があるレベルのセキュリティがあります (Web ベース)。

レポートが生成されるピーク時には、SQL Server が大量のクエリにリソースを使用し、その後 ColdFusion が複数ページの PDF を生成するため、Web アプリケーションとフロントエンド Web サイトの速度が許容できない速度になります。

負荷を軽減するためのベスト プラクティスが何であるかは正確にはわかりませんが、現時点では、レポートへのアクセスを制限することはできません。

最も一般的なクエリを簡素化するために、データを他のテーブルに非正規化することを検討しましたが、それは問題をさらに押し進めるだけのようです.

そのため、2 台目のサーバーを取得し、それを "レポート サーバー" として使用して、クエリが実行される DB のレプリケート コピーを使用することを考えています。これで 1 つの問題は解決しますが、2 つ目の問題は残ります。PDF の生成はリソースを大量に消費します。

そのタスクをレポート サーバーにもオフロードしたいと考えていますが、セキュリティで保護された Web アプリケーションでは、サーバー 1 から Web アプリケーションにログインし、それをWebアプリケーションですが、ユーザーの資格情報を検証せずにサーバー2で生成/取得しています...

誰でもこれを経験したことがありますか?よろしくお願いしますスタックオーバーフロー!!

4

4 に答える 4

3

最も基本的なベスト プラクティスは、Web サーバーと db サーバーを同じハードウェアに配置しないことです。私はそれから始めます。

于 2009-02-25T20:55:13.087 に答える
3

「そのタスクをレポート サーバーにもオフロードしたいのですが、セキュリティで保護された Web アプリケーションでは、サーバー 1 から Web アプリケーションにログインし、それを表示するユーザーで HTTP GET を起動して PDF を作成することはできません。 Webアプリケーションですが、ユーザーの資格情報を検証せずにサーバー2で生成/フェッチしています...」

なぜできないのですか?あなたはウェブサービスを書くために世界で最も簡単な言語を使用しています。ここに私の提案があります。

まず、データベースを独自のサーバーに移動して、cf サーバーと sql サーバーを別々のサーバーに配置します。これを行う最初の理由はパフォーマンスです。既に述べたように、cf と sql の両方を同じサーバー上に置くことは理想的な設定ではありません。2 つ目の理由はセキュリティです。誰かがあなたのウェブサーバーをハッキングできたら、すぐそこにいてあなたのデータを手に入れましょう。セキュリティを強化するために、cf サーバーと sql サーバーの間にファイアウォールを配置する必要があります。最後の理由はスケーラビリティです。より多くのリソースを投入したり、データベースをクラスター化したりする必要がある場合は、それが独自のサーバー上にあると簡単です。

今はウェブサービスです。できることは、別のサーバーに cf をインストールし、レポートの生成を処理する Web サービスを作成することです。新しい cf サーバーをロックダウンして、ssl 接続のみを受け入れ、ユーザーのログイン資格情報を Web サービスに渡すだけです。Web サービス内で、メソッドを呼び出してレポートを生成する前にユーザーを認証します。

今pdf自体のために。パスで行った方法の 1 つは、渡されたいくつかのパラメーター (ユーザー資格情報とクエリを実行するために生成された SQL) に基づいてハッシュを生成し、pdf が生成されたら、ハッシュを pdf の名前に割り当てます。そしてディスクに保存します。これで、pdf が既に存在するかどうかを確認し、存在する場合はそれを返し、そうでない場合は生成してキャッシュすることができる単純なキャッシュ システムができました。

最後に、あなたの問題は、ほとんどの人がこれまで見たことのないものではありません。ちょっとした作業を行うだけで、アプリケーションが大幅に高速化されます。

于 2009-02-26T13:33:22.097 に答える
0

WebサーバーとDBサーバーを分離するためのアドバイスに加えて、次のことを試みました。

a) ストアド プロシージャをまだ使用していない場合は、クエリをストアド プロシージャに移動します。

b) スケジューラによってレポートを生成し、すぐに使用できる状態で特別なテーブルにキャッシュしておくため、顧客は高速なクエリをほとんど使用せずにレポートを選択するだけです。これにより、顧客のレポート作成時間も短縮されます。

お役に立てれば。

于 2009-02-25T21:13:04.743 に答える