12

私はJava Webサーバーを持っており、現在Guavaライブラリを使用してメモリ内キャッシュを処理しています。これは頻繁に使用しています。フェイルオーバーと負荷分散のために、複数のサーバー (2 台以上) に拡張する必要があります。その過程で、代わりにインプロセス キャッシュから Memcache (外部サービス) に切り替えました。ただし、結果にはあまり感銘を受けません。ほぼすべての呼び出しで、別のサーバーへの外部呼び出しを行う必要があり、メモリ内キャッシュよりも大幅に低速です。

Memcache からデータを取得する代わりに、各サーバーでローカル キャッシュを使用し続け、RabbitMQ を使用して、キャッシュを更新する必要があるときに他のサーバーに通知することを考えています。そのため、1 つのサーバーが基になるデータに変更を加えると、他のすべてのサーバーにも、キャッシュが無効であることを伝えるメッセージがブロードキャストされます。すべてのサーバーは、キャッシュ無効化メッセージのブロードキャストとリッスンの両方を行っています。

このアプローチの潜在的な落とし穴を知っている人はいますか? プロダクションでこれを行っている人が他に見つからないので、少し緊張しています。私が見る唯一の問題は、各サーバーがより多くのメモリ (メモリ内キャッシュ) を必要とすることと、特定のサーバーが更新されたデータを取得するのに少し時間がかかることです。他に何か?

4

2 に答える 2

6

ここであなたの問題について少し混乱しているので、私にとって意味のある方法で言い直してから、あなたの質問の私のバージョンに答えます. 私があなたの考えと一致していない場合は、お気軽にコメントしてください。

データ用にプロセス ローカル メモリ キャッシュを使用する Web アプリケーションがあります。組み込みのキャッシュ レプリケーションを備えたサード パーティ ツール (memcached、Couchbase、Redis) に依存するのではなく、複数のノードに拡張し、プログラムに対してこれと同じ構造を維持したい場合。したがって、RabbitMQ を使用して独自のロールを作成し、さまざまなノードに変更を公開して、それに応じてローカル キャッシュを更新できるようにすることを考えています。

私の最初の反応は、あなたがやりたいことは、上記のツールのいずれかにロールオーバーすることによって最もよく行われるということです. 明らかな開発と厳密なテストに加えて、Couchbase、Memcached、および Redis はすべて、お客様の問題を解決するように設計されています。

また、理論的には、水平方向にスケーリングすると、アプリケーション ノードで使用可能なメモリが不足し、実際に混乱することになります。この制限によりアプリが実行不可能になるポイントに到達すると、いずれにしてもツールの 1 つを使用することになり、その時点でカスタム ソリューションを設計するためのすべてのハードワークは無駄になります。

私が考えることができる唯一の例外は、アプリが非常に計算集約的であり、メモリをあまり使用しない場合です。この場合、RabbitMQ ベースのソリューションは簡単だと思いますが、RMQ でメッセージが失われた場合に備えて、サーバー間でキャッシュを同期するための何らかの手順を用意する必要があります。また、ノードの起動とシャットダウンを処理する方法も必要です。

編集

アクセス時間が数百ミリ秒単位で表示されているというコメントの発言を考慮して、最初にセットアップを調べることをお勧めします。Memcached (または Couchbase、または Redis など) インスタンスからのキャッシュ内の単一項目の典型的な読み取り時間は、サブミリ秒 (私の記憶が正しければ約 0.1 ミリ秒) であるため、キャッシュ サーバーの「問題の子」パフォーマンスの観点から、あるべき場所から数桁違います。そこから始めて、まだ同じ問題があるかどうかを確認してください。

于 2014-01-18T05:07:27.190 に答える