Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

クライアント側キャッシュによる Rails のパフォーマンスの向上:マスター条件付き GET リクエスト

ロシアン ドール キャッシュ以外にも、Rails アプリのパフォーマンスを高速化するテクニックは他にもあります。今回は、Rails の組み込み条件付き GET サポートについて見ていきます。これにより、レンダリングされたページをユーザーのブラウザ キャッシュに保存できるようになります。

👋 キャッシュ以外のパフォーマンスについて詳しく読みたい場合は、Ruby (on Rails) のパフォーマンスについてさらに詳しく書いています。Ruby のパフォーマンス監視チェックリストを確認してください。

Etag ヘッダーと Last-Modified ヘッダー

ブラウザが Rails アプリ内のページに対して HTTP GET リクエストを実行すると、ルーターはそれをコントローラー アクションの 1 つにリンクします。次に、コントローラーはデータベースに必要なデータを要求し、ビューをレンダリングします。 HTTP 応答 (200 OK を含む) 応答コードとして) は、ブラウザが解析して表示できるように、応答本文のビューからレンダリングされた HTML とともにブラウザに送り返されます。

リソースが再度リクエストされると、同じパイプラインを通過します。状況によっては、その間ページが変更されなかったため、これは不要です。そのために、HTTP はその ETag を提供します。 および最終更新日 ヘッダー。これらを使用すると、ブラウザは応答本文を保存し、応答本文が古くなったときにヘッダーを使用して無効にすることができます。

E タグ 、またはエンティティ タグ 、クライアント側のキャッシュ検証に使用されるため、HTTP 応答のキャッシュ キーとして考えることができます。これらは、リクエストごとに HTTP レスポンス ヘッダーでブラウザに返されます。

~ $curl -I http://localhost:3000/products/1HTTP/1.1 200 OK...ETag:W/"9462d76cc55aeb6249fa990e39231c7c"Last-Modified:Wed, 25 Apr 2018 08:27:04 GMT...

後で応答が繰り返される場合、ブラウザはキャッシュ内で既存の応答を見つけ、最後のリクエストで保存された Etag を If-None-Match として使用します。 ヘッダー。このヘッダーは、このバージョンがすでにキャッシュに存在することを Rails アプリに伝えます。

リクエストの Etag が現在のものと一致する場合、Rails は 304 Not Modified を送信します。 レスポンスボディのないレスポンス。これにより、代わりにローカル キャッシュのキャッシュを使用するようブラウザに指示されます。

~ $curl -i -H 'If-None-Match:W/"9462d76cc55aeb6249fa990e39231c7c"" http://localhost:3000/products/1HTTP/1.1 304 Not Modified...ETag:W/「9462d76cc55aeb6249fa990e39231c7c」最終更新日:水, 25 4月 2018 08:27:04 GMT...

Rails での条件付き GET リクエスト

ローカルの Rails アプリケーションからページをリクエストすると、Rails がリクエストごとに Etag を自動的に追加することがわかります。同じページを連続して数回リクエストすると、リクエストごとに Etag が変更されたことがわかります。

Rails はデフォルトでリクエストごとに Etag を生成しますが、レスポンス本文全体のダイジェストを使用して Etag を生成します。これは <%= csrf_meta_tags %> を意味します。 csrf-token メタ タグがリクエストごとに変更されるため、レイアウトでは Etag が無効になります。これによりリクエストごとに本文が変更されるため、Etag は無効になり、ローカル キャッシュは古いものとしてマークされます。

それに加えて、Rails は 304 Not Modified を返すことはありません。 デフォルトでは、コントローラ内でローカル キャッシュが明示的に新しいものとしてマークされることはないためです。

fresh_whenstale?

条件付き GET のリクエスト ヘッダーから Etag を使用するには、ローカル キャッシュ内のオブジェクトを「新鮮」として明示的にマークする必要があります。たとえば、製品を表示するページの場合、製品とビュー テンプレートが変更されない限り、キャッシュを最新の状態に保つことができます。これを機能させるために、2 つのことを行います。

<オル>
  • レスポンス本文全体を使用すると、キャッシュされたレスポンスが有効かどうかを確認するために本文全体をレンダリングする必要があり、ページをローカルにキャッシュすることによる高速化が無効になるため、Etag を構成する値を明示的に設定します。
  • リクエストヘッダーの Etag を、前に予測したものと比較します。 ビューをレンダリングします。一致する場合はレンダリングを省略します。
  • Rails には、私たちのためにあらゆることをやってくれるヘルパーが付属しています。 fresh_when を使用すると、Etag と Last-Modified の日付を製品に明示的に基づいて指定できます。 .

     

    明示的な respond_to がある場合 ブロックするには、stale? を使用してください fresh_when の代わりに .

     

    今後は、製品ページの 1 つをリクエストすると、応答がローカルにキャッシュされます。同じページへの後続のリクエストには、キャッシュされたレスポンスがあることを Rails に伝えるための Etag が含まれ、それが新しい Etag と比較されます。それが一致する場合、Rails はページのレンダリングをスキップし、304 Not Modified を返します。

    クライアント側キャッシュによる Rails のパフォーマンスの向上:マスター条件付き GET リクエスト

    メモ :ページを更新すると、常にページのキャッシュされていないバージョンが要求されます。条件付き GET が機能するかどうかをテストするには、リンクを使用するか、代わりに「戻る」ボタンを使用して移動してください。

    この記事と AppSignal Academy シリーズの以前の記事はいかがでしたか? Rails でのキャッシュに関する記事は他にもいくつかありますが、次に書いてほしい内容 (キャッシュ関連またはその他) を遠慮なくお知らせください。

    クライアント側キャッシュによる Rails のパフォーマンスの向上:マスター条件付き GET リクエスト

    ジェフ・クリーフトマイヤー


    1. RubyでシンプルなWebSocketサーバーをゼロから構築する

      最近、WebSocketはますます報道されています。彼らは「未来」だと聞いています。 Rails 5のActionCableのおかげで、これまで以上に使いやすくなっていると聞いています。しかし、WebSocketとは正確には何でしょうか。それらはどのように機能しますか? この投稿では、Rubyで単純なWebSocketサーバーを最初から構築することで、これらの質問に答えます。完了すると、ブラウザとサーバー間の双方向通信が実現します。 この投稿のコードは、学習演習として意図されています。実際の本番アプリにWebSocketを実装する場合は、優れたWebSocket-rubygemを確認して

    2. Ruby2.6の9つの新機能

      Rubyの新しいバージョンには、新しい機能とパフォーマンスの改善が含まれています。 変更についていきますか? 見てみましょう! 無限の範囲 Ruby 2.5以前のバージョンは、すでに1つの形式の無限範囲をサポートしています( Float ::INFINITY を使用) )、しかしRuby2.6はこれを次のレベルに引き上げます。 新しい無限の範囲 次のようになります: (1..) これは、(1..10)のような終了値がないため、通常の範囲とは異なります。 。 使用例 : [a, b, c].zip(1..) # [[a, 1], [b, 2], [c, 3]] [1,2,3,