1

私はScalingRailsのスクリーンキャストに追いついてきました。高度なHTTPキャッシング(VarnishやSquidなどのリバースプロキシキャッシュを使用)をカバーするエピソード11では、Railsアプリケーション内のページ、アクション、フラグメントキャッシングの可能性をすでに使い果たした後でのみ、リバースプロキシキャッシュの使用を検討することをお勧めします。 (memcachedなども同様ですが、この質問には関係ありません)。

私が完全に理解できないのは、HTTPリバースプロキシキャッシュを使用すると、すでにページキャッシュを使用しているアプリケーションのパフォーマンスがどのように向上するかということです。問題を単純化するために、ここで単一のホストについて話していると仮定しましょう。

これは、両方の手法がどのように機能するかについての私の理解です(おそらく私は間違っています):

  • ページキャッシングでは、Railsプロセスが最初にヒットし、その後、そのリクエストのキャッシュが有効である限り、後続のリクエストのためにWebサーバーによって直接提供される静的HTMLファイルを生成します。キャッシュの有効期限が切れている場合は、Railsが再度ヒットされ、静的ファイルが再生成され、更新されたコンテンツが次のリクエストに対応できるようになります。

  • HTTPリバースプロキシキャッシュを使用すると、プロキシがコンテンツが古くなっているかどうかを判断する必要がある場合に、Railsプロセスがヒットします。ETagこれは、などのさまざまなHTTPヘッダーを使用して行われますLast-Modified。コンテンツが新しい場合、RailsはHTTP 304 Not Modifiedでプロキシに応答し、プロキシはキャッシュされたコンテンツをブラウザに提供します。さらに良いのは、独自のHTTP304で応答することです。 。コンテンツが古くなっている場合、Railsは更新されたコンテンツをプロキシに提供します。プロキシはコンテンツをキャッシュしてからブラウザに提供します。

私の理解が正しければ、ページのキャッシュによってRailsプロセスへのヒットが少なくなるのではないでしょうか。コンテンツが古くなっているかどうかを判断するために行ったり来たりすることはすべてありません。つまり、リバースプロキシキャッシングよりもパフォーマンスが優れています。なぜ両方の手法を組み合わせて使用​​するのでしょうか。

4

4 に答える 4

2

あなたが正しいです。

それを考慮する唯一の理由は、apacheセットが期限切れのヘッダーであるかどうかです。この構成では、プロキシはApacheから負荷の一部を取り除くことができます。

そうは言っても、apachestaticvsプロキシキャッシュはrailsの世界ではほとんど無関係です。どちらも天文学的に速いです。

あなたが得るであろう利点はあなたのページなしのキャッシュ可能なもののためになるでしょう。

私はページキャッシング(ala heroku)よりもプロキシキャッシングを使用することを好みますが、それは私だけであり、余談です。

于 2010-01-29T16:28:03.293 に答える
1

優れたプロキシキャッシュの実装(Squid、Traffic Serverなど)は、プリフォークMPMを使用する場合、Apacheよりもはるかにスケーラブルです。ワーカーMPMを使用している場合、Apacheは問題ありませんが、プロキシは高負荷(数万リクエスト/秒)でもはるかにスケーラブルです。

于 2010-04-30T23:19:11.720 に答える
1

たとえば、Varnishには、同じURL(キャッシュにない)への同時リクエストがキューに入れられ、単一/最初のリクエストのみが実際にバックエンドにヒットする場合の機能があります。これにより、従来のページキャッシングシナリオで回避することがほぼ不可能な厄介な犬の山のケースを防ぐことができます。

于 2010-06-17T15:57:31.907 に答える
0

アプリサーバーが1つしかないセットアップでリバースプロキシを使用すると、IMOが少しやり過ぎになります。複数のアプリサーバーを使用する構成では、リバースプロキシ(ワニスなど)がページキャッシュの最も効果的な方法です。

2つのアプリサーバーを使用したセットアップについて考えてみます。

  • ユーザー「Bob」(ノード「A」にリダイレクト)が新しいメッセージを投稿すると、ページが期限切れになり、ノード「A」で再作成されます。

  • ユーザー「Cindy」(ノード「B」にリダイレクト)は、「Bob」からの新しいメッセージが表示されるページを要求しますが、ノード「B」のページの有効期限が切れて再作成されていないため、新しいメッセージを表示できません。 。

この同時実行の問題は、リバースプロキシを使用して解決できます。

于 2010-08-15T22:43:12.583 に答える