কম্পিউটার

রেলে ক্লায়েন্ট-সাইড ক্যাশিং:শর্তাধীন GET অনুরোধ

রাশিয়ান ডল ক্যাশিং ছাড়াও, রেল অ্যাপগুলিতে কর্মক্ষমতা বাড়ানোর জন্য আরও কৌশল রয়েছে। এইবার আমরা Rails-এর অন্তর্নির্মিত শর্তসাপেক্ষ GET সমর্থন দেখব, যা আপনাকে ব্যবহারকারীর ব্রাউজার ক্যাশে রেন্ডার করা পৃষ্ঠাগুলি সংরক্ষণ করতে দেয়৷

👋 এবং আপনি যদি ক্যাশিংয়ের বাইরে পারফরম্যান্স সম্পর্কে আরও পড়তে চান তবে রুবি (রেলগুলিতে) পারফরম্যান্স সম্পর্কে আমরা আরও অনেক কিছু লিখেছি, আমাদের রুবি পারফরম্যান্স মনিটরিং চেকলিস্টটি দেখুন৷

Etag এবং সর্বশেষ-সংশোধিত শিরোনাম

যখন আপনার ব্রাউজার আপনার Rails অ্যাপে একটি পৃষ্ঠার জন্য একটি HTTP GET অনুরোধ চালায়, তখন রাউটার এটিকে আপনার নিয়ামক ক্রিয়াগুলির একটিতে লিঙ্ক করবে। নিয়ন্ত্রক তারপর ডাটাবেস থেকে প্রয়োজনীয় ডেটা অনুরোধ করবে এবং ভিউ রেন্ডার করবে। একটি HTTP প্রতিক্রিয়া (200 OK সহ প্রতিক্রিয়া কোড হিসাবে) তারপর আপনার ব্রাউজারকে পার্স এবং প্রদর্শনের জন্য প্রতিক্রিয়ার বডির ভিউ থেকে রেন্ডার করা HTML সহ ব্রাউজারে ফেরত পাঠানো হয়৷

রিসোর্স আবার অনুরোধ করা হলে, আমরা একই পাইপলাইনের মধ্য দিয়ে যাব। কিছু পরিস্থিতিতে, এটি অপ্রয়োজনীয় কারণ এর মধ্যে পৃষ্ঠাটি পরিবর্তন হয়নি৷ এর জন্য, HTTP তার ETag অফার করে এবং শেষ-সংশোধিত হেডার এগুলো ব্যবহার করে, ব্রাউজার রেসপন্স বডি সঞ্চয় করতে পারে এবং হেডার ব্যবহার করে সেগুলি বাসি হয়ে গেলে সেগুলিকে বাতিল করতে পারে।

Etags , অথবা সত্তা ট্যাগ , ক্লায়েন্ট-সাইড ক্যাশে যাচাইকরণের জন্য ব্যবহার করা হয়, তাই আপনি সেগুলিকে আপনার 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 যোগ করে। যদি আমরা একই পৃষ্ঠাটি পরপর কয়েকবার অনুরোধ করি, আমরা প্রতিটি অনুরোধের জন্য Etag পরিবর্তন দেখতে পাব।

যদিও Rails ডিফল্টরূপে প্রতিটি অনুরোধের জন্য একটি Etag তৈরি করে, এটি তৈরি করতে এটি সমগ্র প্রতিক্রিয়া বডির একটি ডাইজেস্ট ব্যবহার করে। এর মানে হল <%= csrf_meta_tags %> লেআউটে Etag বন্ধ করে দেয়, কারণ প্রতিটি অনুরোধের জন্য csrf-টোকেন মেটা ট্যাগ পরিবর্তিত হয়। যেহেতু এটি প্রতিটি অনুরোধের জন্য মূল অংশকে পরিবর্তন করে, তাই Etag অকার্যকর করা হয় এবং স্থানীয় ক্যাশেকে পুরানো হিসাবে চিহ্নিত করা হয়৷

তা ছাড়া, রেল কখনই 304 Not Modified ফেরত দেবে না ডিফল্টরূপে, কারণ স্থানীয় ক্যাশে কখনই আমাদের কন্ট্রোলারে স্পষ্টভাবে তাজা হিসাবে চিহ্নিত করা হয় না।

fresh_when এবং stale?

শর্তসাপেক্ষ GET-এর জন্য অনুরোধ শিরোনাম থেকে Etags ব্যবহার করতে, আমাদের স্থানীয় ক্যাশে একটি বস্তুকে স্পষ্টভাবে "তাজা" হিসাবে চিহ্নিত করতে হবে। উদাহরণস্বরূপ, একটি পণ্য দেখায় এমন একটি পৃষ্ঠার জন্য, যতক্ষণ পর্যন্ত পণ্যটি এবং ভিউ টেমপ্লেটগুলি পরিবর্তন না হয় ততক্ষণ আমরা ক্যাশেকে তাজা রাখতে পারি। সেই কাজটি করতে, আমরা দুটি জিনিস করব৷

  1. আমরা স্পষ্টভাবে মানগুলি সেট করব যা আমাদের Etag তৈরি করবে, কারণ পুরো রেসপন্স বডি ব্যবহার করে ক্যাশে করা রেসপন্স বৈধ কিনা তা পরীক্ষা করার জন্য আমাদের পুরো বডি রেন্ডার করতে হবে, যা পৃষ্ঠাটিকে স্থানীয়ভাবে ক্যাশে করার গতিকে অস্বীকার করে৷<
  2. আমরা অনুরোধের শিরোনাম থেকে Etag এর সাথে তুলনা করব যা আমরা পূর্বাভাস দিয়েছিলাম আগে ভিউ রেন্ডার করা হচ্ছে, এবং যদি সেগুলি মিলে যায় তাহলে আমরা রেন্ডারিং বাদ দেব৷

রেল সাহায্যকারীর সাথে আসে যা আমাদের জন্য সবকিছু করে। আমরা fresh_when ব্যবহার করে পণ্যের Etag এবং শেষ-সংশোধিত তারিখ স্পষ্টভাবে বেস করতে পারি .

# app/views/products/show.html.erb
def show
  @product = Product.find(params[:id])
  fresh_when @product
end

যদি আপনার কাছে একটি স্পষ্ট respond_to থাকে ব্লক, stale? ব্যবহার করুন fresh_when এর পরিবর্তে .

# 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 অন্তর্ভুক্ত থাকবে Rails কে জানাতে যে আমাদের একটি ক্যাশেড প্রতিক্রিয়া আছে, যেটিকে নতুন Etag এর সাথে তুলনা করা হয়। যদি এটি মেলে, রেলগুলি পৃষ্ঠাটি রেন্ডার করা এড়িয়ে যাবে এবং একটি 304 Not Modified ফেরত দেবে অবিলম্বে।

দ্রষ্টব্য :পৃষ্ঠাটি রিফ্রেশ করা সর্বদা পৃষ্ঠার একটি আনক্যাশড সংস্করণের অনুরোধ করবে৷ আপনার শর্তাধীন GETগুলি কাজ করে কিনা তা পরীক্ষা করতে, একটি লিঙ্ক ব্যবহার করে বা পিছনের বোতাম ব্যবহার করে নেভিগেট করুন৷

অ্যাপসিগন্যাল একাডেমি সিরিজের এই নিবন্ধটি এবং আগের নিবন্ধগুলি আপনার কেমন লেগেছে? আমাদের কাছে রেল লাইনে ক্যাশিং সম্পর্কে আরও কিছু নিবন্ধ রয়েছে, কিন্তু অনুগ্রহ করে আমাদের জানাতে দ্বিধা করবেন না যে আপনি পরবর্তীতে (ক্যাশিং-সম্পর্কিত বা অন্যথায়) কী লিখতে চান!


  1. পাইথন প্রোগ্রামিং ব্যবহার করে অনুরোধগুলি পান এবং পোস্ট করুন৷

  2. রেলের সাথে হটওয়্যার ব্যবহার করা

  3. AWS Lambda এ রেল স্থাপন করা হচ্ছে

  4. রেলের সাথে কৌণিক ব্যবহার 5