2

Hibernateを介して書き込みおよび読み取り要求をDBに送信するWebサイトがあるとします。私はJavaを使用していますが、この質問には関係ありません。

通常、DBから新しいデータを読み取りたいと思います。ただし、パフォーマンスを向上させるために、書き込まれたデータが読み取りに表示されるまでに多少の遅延を導入したいと思います。つまり、DBに挿入された行をすぐに「公開」する必要はありません。少し遅れて新しいデータを「公開」しても大丈夫です。

どうすればそれを達成できますか?

私が理解している限り、これは私のシステムのいくつかの異なる層に設定することができます。

  1. フロントエンドでいくつかのリクエストをキャッシュできます。おそらく、このためにプロキシサーバーを設定する必要があります。ただし、これはクエリのすべてのパラメータが一致する場合にのみ機能します。

  2. 読み取りリクエストをHibernateにキャッシュできます。OKですが、新しい挿入が発生した後、読み取りクエリが古いデータを返す平均時間を指定または見積もることはできますか?言い換えると、新しいデータがユーザーに表示されるまでの遅延時間をどのように制御できますか?または、Hibernateキャッシュの代わりにmemcachedシステムのようなものを使用する必要がありますか?

  3. おそらく私はDBに何かを設定することができます。DBで何をすべきかわかりません。おそらく、分離レベルを緩和してDBのパフォーマンスをバーストさせることができます。

それで、どちらの方法が最良ですか?

そしてもちろん、主な質問です。ここで紹介する要件の緩和は、システムのパフォーマンスを向上させるのに本当に役立つのでしょうか。

4

2 に答える 2

1

あなたのアーキテクチャを正しく読んでいれば、クライアント - >サーバー - >データベースサーバーがあります

各ポイントの答え

  1. 独自のクライアントのみを使用する場合、これにより、クライアントにキャッシュを実装する負担がかかります。この方法を使用します。クライアントのパフォーマンスが改善される可能性があり、サーバーとデータベース サーバーの負荷が軽減されるため、スケーリングが向上します。

  2. 現在、サーバーでキャッシュすると、データベース サーバーのスケーラビリティとクライアントのパフォーマンスが向上する可能性がありますが、サーバーにメモリ負荷がかかります。これは私の2番目のオプションです

  3. データベースに何かを実装します。この時点で、あなたは何を得ていますか?データベース サーバーは、どの行を送り返すかを決定する作業を行う必要があります。また、スケーラビリティの利点も得られません。

要約すると、サーバーでキャッシュできない場合は、クライアントで最初にキャッシュします。DB をループから外します。

于 2013-03-05T15:13:16.783 に答える
0

あなたの主な質問に答えるために - キャッシングは、データベースのパフォーマンスによって制約される Web アプリケーションのパフォーマンスとスケーラビリティの両方を向上させる最も効果的な方法の 1 つです。

一般に、最適化を開始する前に、負荷テスト装置をセットアップし、アプリのさまざまな部分を測定してボトルネックを特定することをお勧めします。

最も効果的なキャッシュは、システムの外部 (CDN またはユーザーのブラウザー) です。ブラウザのキャッシュについて調べて、ローカルにキャッシュできるものがないか確認してくださいブラウザーには標準機能としてキャッシュが組み込まれています。HTTP ヘッダーを介して制御します。これらのキャッシュは、リクエストがインフラストラクチャに到達することさえも停止するため、非常に効果的です。画像、JavaScript ファイル、スタイルシートなどの静的 Web アセットには非常に効率的です。プロキシ サーバーも同じカテゴリにあると考えます。主な欠点は、このキャッシュを管理するのが難しいことです。ブラウザに「これを 2 週間キャッシュしてください」と言った後、更新するのは困難です。

次に効果的なキャッシング レイヤーは、Web ページ (の一部) をアプリケーション サーバーにキャッシュすることです。これができれば、ページをレンダリングするコストと、データベースからデータを取得するコストの両方を回避できます。Web フレームワークが異なれば、これに対するソリューションも異なります。

次に、ORM レベルでキャッシュできます。Hibernate にはかなり堅牢な実装があり、キャッシュ戦略に多くの粒度を提供します。この記事では、有効期限を制御する方法を含む実装例を示します。ここでキャッシングを細かく制御できます。テーブル レベルで動作を指定できるため、「ルックアップ」データを数日間、「トランザクション」データを数秒間キャッシュできます。

データベースはすでに「ボンネットの下」にキャッシュを実装しています。たとえば、頻繁に使用されるデータをメモリにロードします。一部のアプリケーションでは、複雑なデータを「非正規化」することでデータベースのパフォーマンスをさらに向上させることができます。そのため、インポート ルーチンによって複雑なデータ構造が単純なデータ構造に変換される場合があります。これは、データの一貫性と保守性とパフォーマンスのトレードオフになります。

于 2013-03-05T15:41:03.667 に答える