রাশিয়ান ডল ক্যাশিং ছাড়া রেলস অ্যাপ্লিকেশনের পারফরম্যান্স বেড়ানোর আরও কয়েকটি টেকনিক রয়েছে। এইবার আমরা রেলসের বিল্ট-ইন কন্ডিশনাল GET সাপোর্টের ওপর নজর দিব, যা রেন্ডার করা পেজগুলো ইউজারের ব্রাউজার ক্যাশে স্টোর করার সুযোগ দেয়।
👋 যদি ক্যাশিং ছাড়া পারফরম্যান্স সম্পর্কে আরও পড়তে চান, আমাদের রুবি (অন রেলস) পারফরম্যান্স মনিটরিং চেকলিস্ট দেখুন।
Etag এবং Last-Modified হেডার
যখন আপনার ব্রাউজার আপনার রেলস অ্যাপের একটি পেজের জন্য HTTP GET রিকোয়েস্ট পাঠায়, রাউটার সেটিকে আপনার কন্ট্রোলার অ্যাকশনগুলির সাথে লিংক করে। কন্ট্রোলার তারপর ডেটাবেস থেকে প্রয়োজনীয় ডেটা অনুরোধ করে এবং ভিউ রেন্ডার করে। একটি HTTP রেসপন্স (200 OK রেসপন্স কোড সহ) ব্রাউজারের কাছে ফিরে যায়, যার বডিতে ভিউ থেকে রেন্ডার করা HTML থাকে যেটি ব্রাউজার পার্স করে প্রদর্শন করে।
যখন একই রিসোর্সটি আবার অনুরোধ করা হয়, আমরা একই পাইপলাইনের মধ্য দিয়ে যাই। কিছু পরিস্থিতিতে, এটি অপ্রয়োজনীয় হয় কারণ মাঝপথে পেজটি পরিবর্তন হয়নি। সেজন্য HTTP তার ETag এবং Last-Modified হেডার অফার করে। এগুলো ব্যবহার করে ব্রাউজার রেসপন্স বডি স্টোর করতে পারে এবং হেডারগুলো ব্যবহার করে সেগুলো স্টেল হয়ে গেলে ইনভ্যালিডেট করতে পারে।
ETag-গুলো, বা এন্টিটি ট্যাগ ক্লায়েন্ট-সাইড ক্যাশ ভ্যালিডেশনের জন্য ব্যবহৃত হয়, তাই আপনি সেগুলো আপনার 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 যোগ করে। যদি একই পেজটি এক সার mehrere বার অনুরোধ করা হয়, আমরা দেখতে পাব ETag প্রতিটি রিকোয়েস্টের জন্য পরিবর্তিত হচ্ছে।
যদিও রেলস ডিফল্টভাবে প্রতিটি রিকোয়েস্টের জন্য একটি ETag জেনারেট করে, এটি পুরো রেসপন্স বডির একটি ডাইজেস্ট ব্যবহার করে সেটি তৈরি করে। এর মানে লেআউটে থাকা <%= csrf_meta_tags %> ETag কে ব〜」ব المصنوعة 、 因为 csrf-token মেটা ট্যাগ প্রতিটি রিকোয়েস্টের জন্য পরিবর্তিত হয়। যেহেতু এটি প্রতিটি রিকোয়েস্টের জন্য বডি পরিবর্তন করে, ETag ইনভ্যালিডেট হয় এবং লোকাল ক্যাশ স্টেল হিসেবে চিহ্নিত হয়।
এছাড়া, রেলস ডিফল্টভাবে কখনো 304 Not Modified রিটার্ন করে না, কারণ লোকাল ক্যাশ কখনো এক্সপ্লিসিটলি আমাদের কন্ট্রোলারে ফ্রেশ হিসেবে চিহ্নিত হয়নি।
fresh_when এবং stale?
কন্ডিশনাল GET-এর জন্য রিকোয়েস্ট হেডার থেকে ETag ব্যবহার করতে হলে, আমাদের লোকাল ক্যাশে একটি অবজেক্টকে এক্সপ্লিসিটলি "ফ্রেশ" হিসেবে চিহ্নিত করতে হবে। উদাহরণস্বরূপ, একটি প্রোডাক্ট দেখানোর পেজের জন্য, আমরা ক্যাশকে ততক্ষণ ফ্রেশ রাখতে পারি যতক্ষণ না প্রোডাক্ট এবং ভিউ টেমপ্লেটগুলো পরিবর্তন হয়। এটিকে কাজ করতে দেওয়ার জন্য আমরা দুটি কাজ করব।
- আমরা এক্সপ্লিসিটলি সেই মানগুলো সেট করব যেগুলো আমাদের ETag তৈরি করবে, কারণ পুরো রেসপন্স বডি ব্যবহার করলে ক্যাশড রেসপন্সটি ভ্যালিড কিনা চেক করার জন্য পুরো বডি রেন্ডার করতে হতো, যা লোকাল ক্যাশিং থেকে স্পিডআপ নীহিত করে দেবে।
- আমরা রিকোয়েস্ট হেডার থেকে ETag কে ভিউ রেন্ডার করার পূর্বে আমরা প্রেডিক্ট করব, এবং যদি সেগুলো মিলে যায় তবে রেন্ডারিং বাদ দিব।
রেলস এর জন্য হেল্পারগুলো প্রদান করে। আমরা প্রোডাক্টের ওপর ভিত্তি করে ETag এবং Last-Modified ডেটা এক্সপ্লিসিটলি সেট করতে fresh_when ব্যবহার করতে পারি।
যদি আপনার একটি এক্সপ্লিসিট respond_to ব্লক থাকে, fresh_when এর বদলে stale? ব্যবহার করুন।
এখন, একটি প্রোডাক্ট পেজ অনুরোধ করলে রেসপন্স লোকালি ক্যাশ হবে। একই পেজের জন্য পরবর্তী যেকোনো রিকোয়েস্ট ETag সহ আসবে যাতে রেলসকে বলা যায় আমাদের ক্যাশড রেসপন্স রয়েছে, যা তারপর নতুন ETag এর সাথে তুলনা করা হবে। যদি সেগুলো মিলে যায়, রেলস পেজ রেন্ডার করা বাদ দিয়ে অবিলম্বে 304 Not Modified রিটার্ন করবে।

নোট: পেজ রিফ্রেশ করলে সবসময় পেজের একটি অনক্যাশড ভার্সন অনুরোধ করা হবে। আপনার কন্ডিশনাল GET গুলো কাজ করছে কিনা টেস্ট করতে, একটি লিংক বা ব্যাক বাটন ব্যবহার করে অন্য পেজে যান।
এই আর্টিকেলটি এবং অ্যাপসিগন্যাল একাডেমি সিরিজের পূর্বের আর্টিকেলগুলো আপনাকে কেমন লেগেছে? আমাদের ক্যাশিং সম্পর্কে আরও কিছু আর্টিকেল পাইপলাইনে আছে, কিন্তু দয়া করে আমাদের জানাতে সংকোচ করবেন না আপনি ক্যাশিং-রিলেটেড নন-রিলেটেড যেকোনো বিষয়ে আমাদের লিখতে চান।