রাশিয়ান ডল ক্যাশিং ছাড়াও রেইলস অ্যাপে পারফরম্যান্স বাড়ানোর আরও টেকনিক আছে। এইবার আমরা রেইলসের বিল্ট-ইন কন্ডিশনাল GET সাপোর্ট দেখব, যা আপনাকে রেন্ডারড পেজগুলো ইউজারের ব্রাউজার ক্যাশে স্টোর করতে দেয়।
👋 এবং আপনি যদি ক্যাশিং বাদে পারফরম্যান্স সম্পর্কে আরও পড়তে চান, তবে আমাদের রুবি (অন রেইলস) পারফরম্যান্স মনিটরিং চেকলিস্ট দেখুন।
Etag এবং Last-Modified হেডার
যখন আপনার ব্রাউজার আপনার রেইলস অ্যাপের একটি পেজের জন্য HTTP GET রিকোয়েস্ট এক্সিকিউট করে, রাউটার এটিকে আপনার কন্ট্রোলার অ্যাকশনের একটের সাথে লিংক করে। কন্ট্রোলার তারপর ডাটাবেস থেকে প্রয়োজনীয় ডেটা রিকোয়েস্ট করে এবং ভিউ রেন্ডার করে। একটি HTTP রেসপন্স (রেসপন্স কোড 200 OK) তারপর ব্রাউজারের কাছে পাঠানো হয় রেন্ডারড HTML ভিউতে রেসপন্স বডিতে থাকা যা আপনার ব্রাউজার পার্স ও ডিসপ্লে করে।
যখন রিসোর্সটি আবার রিকোয়েস্ট করা হয়, আমরা একই পাইপলাইন থ্রু করি। কিছু পরিস্থিতিতে, এটি অপ্রয়োজনীয় কারণ মিডটাইমে পেজটি পরিবর্তন হয়নি। সেটির জন্য HTTP তার ETag এবং Last-Modified হেডার অফার করে। এগুলো ব্যবহার করে, ব্রাউজার রেসপন্স বডি স্টোর করতে পারে, এবং হেডারগুলো ব্যবহার করে সেগুলো স্টেল (stale) হলে ইনভ্যালিডেট করতে পারে।
Etags, বা Entity tags, ক্লায়েন্ট-সাইড ক্যাশ ভ্যালিডেশন জন্য ব্যবহৃত হয়, তাই আপনি সেগুলো আপনার HTTP রেসপন্সের ক্যাশ কী হিসেবে চিন্তা করতে পারেন। সেগুলো প্রতি রিকোয়েস্টে HTTP রেসপন্স হেডারে ব্রাউজারের কাছে পাস করা হয়।
~ $ curl -I https://localhost:3000/products/1 HTTP/1.1 200 OK ... ETag: W/"9462d76cc55aeb6249fa990e39231c7c" Last-Modified: Wed, 25 Apr 2018 08:27:04 GMT ...
যদি রেসপন্সটি পরে রিপিট করা হয়, ব্রাউজার ক্যাশে বিদ্যমান রেসপন্সটি খুঁজে পায় এবং লাস্ট রিকোয়েস্ট থেকে স্টোর করা Etag কে If-None-Match হেডার হিসেবে ব্যবহার করে। এই হেডার আমাদের রেইলস অ্যাপকে বলে যে আমাদের এই ভার্সন ক্যাশে আছে।
যদি রিকোয়েস্ট থেকে Etag করেন্ট টির সাথে মেলে, রেইলস একটি 304 Not Modified রেসপন্স পাঠাবে রেসপন্স বডি ছাড়া। এটি ব্রাউজারকে বলে তার লোকাল ক্যাশ থেকে সেটি ব্যবহার করতে।
~ $ curl -i -H 'If-None-Match: W/"9462d76cc55aeb6249fa990e39231c7c"' https://localhost:3000/products/1 HTTP/1.1 304 Not Modified ... ETag: W/"9462d76cc55aeb6249fa990e39231c7c" Last-Modified: Wed, 25 Apr 2018 08:27:04 GMT ...
রেইলসে কন্ডিশনাল GET রিকোয়েস্ট
আমরা একটি লোকাল রেইলস অ্যাপ্লিকেশন থেকে একটি পেজ রিকোয়েস্ট করলে, দেখতে পাই রেইলস প্রতিটি রিকোয়েস্টের জন্য অটোমেটিক্যালি একটি Etag অ্যাড করে। আমরা একই পেজটি একের পর এক birkaçবার রিকোয়েস্ট করলে, দেখতে পাই প্রতিটি রিকোয়েস্টের জন্য Etag পরিবর্তন হয়।
যদিও রেইলস ডিফল্টভাবে প্রতিটি রিকোয়েস্টের জন্য একটি Etag জেনারেট করে, এটি পুরো রেসপন্স বডির একটি ডাইজেস্ট ব্যবহার করে সেটি জেনারেট করতে। এর মানে <%= csrf_meta_tags %> লেআউটে Etag-কে থ্রো অফ করে, কারণ csrf-token মেটা ট্যাগ প্রতিটি রিকোয়েস্টে পরিবর্তন হয়। যেহেতু সেটি প্রতিটি রিকোয়েস্টে বডি পরিবর্তন করে, Etag ইনভ্যালিডেট হয় এবং লোকাল ক্যাশ স্টেল হিসেবে মার্ক করা হয়।
অতিরিক্ত, রেইলস ডিফল্টভাবে কখনো 304 Not Modified রিটার্ন করে না, কারণ লোকাল ক্যাশ কখনো এক্সপ্লিসিটলি কন্ট্রোলারে फ्रেশ হিসেবে মার্ক করা হয়নি।
fresh_when এবং stale?
রিকোয়েস্ট হেডার থেকে Etag কন্ডিশনাল GET-র জন্য ব্যবহার করতে, আমাদেরকে লোকাল ক্যাশে একটি অবজেক্টকে এক্সপ্লিসিটলি "ফ্রেশ" হিসেবে মার্ক করতে হবে। উদাহরণস্বরূপ, একটি প্রোডাক্ট দেখানোর পেজের জন্য, আমরা ক্যাশ ফ্রেশ রাখতে পারি যতক্ষণ না প্রোডাক্ট এবং ভিউ টেমপ্লেটগুলো পরিবর্তন হয়। সেটি কাজ করার জন্য, আমরা দুটি কাজ করব।
- আমরা এক্সপ্লিসিটলি সেই ভ্যালুগুলো সেট করব যেগুলো আমাদের Etag বানাবে, কারণ পুরো রেসপন্স বডি ব্যবহার করলে পুরো বডি রেন্ডার করতে হবে ক্যাশড রেসপন্স ভ্যালিড কিনা চেক করার জন্য, যা লোকালি পেজ ক্যাশ করার স্পিডআপকে নেগেট করবে।
- আমরা রিকোয়েস্ট হেডার থেকে Etag কে আমাদের প্রেডিক্টেড টির সাথে তুলনা করব ভিউ রেন্ডার করার আগে, এবং যদি সেগুলো মেলে তবে রেন্ডারিং বাদ দিব।
রেইলস হেল্পার দিয়ে এটা সব করে দেয়। আমরা এক্সপ্লিসিটলি Etag এবং Last-Modified ডেট প্রোডাক্টের ওপর বেস করতে পারি fresh_when ব্যবহার করে।
# app/views/products/show.html.erb def show @product = Product.find(params[:id]) fresh_when @product end
আপনার যদি এক্সপ্লিসিট respond_to ব্লক থাকে, তবে fresh_when-এর বদলে stale? ব্যবহার করুন।
# app/views/products/show.html.erb def show @product = Product.find(params[:id]) if stale?(@product) respond_to do |format| format.html end end end
এখন, একটি প্রোডাক্ট পেজ রিকোয়েস্ট করলে রেসপন্স লোকালি ক্যাশ হবে। সেইম পেজের যেকোনো পরবর্তী রিকোয়েস্ট Etag ইনক্লুড করবে রেইলসে জানাতে যে আমাদের একটি ক্যাশড রেসপন্স আছে, যা তারপর নতুন Etag-এর সাথে তুলনা হবে। যদি সেগুলো মেলে, রেইলস পেজ রেন্ডার করা বাদ দিবে, এবং তৎক্ষণাৎ 304 Not Modified রিটার্ন করবে।
নোট: পেজ রিফ্রেশ করলে সবসময় আনক্যাশড ভার্সন রিকোয়েস্ট করবে। আপনার কন্ডিশনাল GET কাজ করছে কিনা টেস্ট করতে, একটি লিংক বা ব্যাক বাটন ব্যবহার করে নেভিগেট করুন রিফ্রেশ করার বদলে।
এই আর্টিকেল এবং AppSignal Academy সিরিজের আগের আর্টিকেলগুলো আপনার কেমন লেগেছে? ক্যাশিং সম্পর্কে রেইলসে আরও কিছু আর্টিকেল লাইন আপ করা আছে, কিন্তু দয়া করে আমাদের জানাতে হিচকিচাবেন না আপনি কী বিষয়ে আমাদের লিখতে চান (ক্যাশিং-রিলেটেড বা অন্যथा)!