প্রথমত শুরু করি ক্যশিং কি?
ক্যশিং হচ্ছে টেম্পরারি ডাটা স্টোর করার একটি মাধ্যম যা সাধারনত স্টোরকৃত ডাটাকে দ্রুত রিড এবং রাইট করার সুবিধা দিয়ে থাকে, এবং এর ডাটা গুলো মেমরির মধ্য জমা থাকে, যার ফলে রিডটাইম অনেক ফাস্ট হয়।
ক্যশিং প্রধানত দুই যায়গায় করা হয়ে থাকে। সার্ভার সাইডে, ক্লায়েন্ট সাইডে।
কথা বলি সার্ভার সাইডের ক্যাশিং নিয়ে, বাস্তব জীবনের চেলেঞ্জ এবং সমাধান থেকে আশা করি আরও ভালো ভাবে বোঝা যাবে।
ধরি আপনার একটা স্ট্রিমিং আ্যপ আছে। আপনার আ্যপের প্রতিমিনিটে কনকারেন্ট ইউজার হচ্ছে ১০০০। এখন প্রথম যখন কোনো ইউজার আপনার আ্যপে ঢুকে, আ্যপ বেকেন্ডে একটা API কল করে ওই ইউজার কে ভিডিও দেখানোর জন্য। ধরে নিলাম খুবই বেসিক একটা রেসপন্স করলো বেকেন্ড থেকে, কোনো ধরনের ফিল্টার বা রিলেশনাল টেবিল কুয়েরি করলো না ডাটাবেজে , তাও ১ টা কুয়েরি হলো ডাটাবেজে ইউজারকে ভিডিও লিস্ট দেখানোর জন্য।
কুয়েরি হলো প্রথম ধাপ, এর পর হলো ডাটা সিরিয়ালাইজেশন। যা কুয়েরি কৃত ডাটাকে JSON ফরম্যট এ কনভার্ট করে (যদি প্রযোয্য হয়)। এবং সবার শেষে ওই সিরিয়ালিয়াজকৃত ডাটাকে রেসপন্স করে।
এখন যেহেতু আপনার কনকারেন্ট ইউজার ১০০০, তাহলে ১ মিনিটে API কল হবে ১০০০ বার। আর কুয়েরি হবে ১০০০ টা।
আর এইভাবে যদি ১০ মিনিট ১০০০ ইউজার কনকারেন্ট থাকে তাহলে API কল হবে ১০০০০ বার আর কুয়েরিও হবে ১০০০০ টা, যা আপনারা খুব ভালো ভাবেই জানেন যে ডাটাবেইজে প্রেসার ক্রিয়েট করবে, সাথে সার্ভার বিল তো আছেই।
তাহলে আমাদের ঝামেলা হচ্ছে কুয়েরি করাতে। আমরা কি পারি না একটা নির্দিষ্ট সময় ধরে ডাটবেজে হিট না করে ভিডিও লিস্ট টা রেসপন্স করতে?
এইখানে আমরা ক্যশিং ইন্ট্রডিউস করে থাকি সাধারনত। ধরে নিলাম ৩০ মিনিট পর্যন্ত আমি চাচ্ছি না বা ইচ্ছে করেই একই ভিডিও লিস্ট রেন্ডমলি শাফল করে সকল ইউজার কে দেখাতে। এই ক্ষেত্রে আমি একটা CACHE_KEY চুজ করলাম এন্ড এই ক্যশ কি এর আন্ডারে প্রথম যখন কোনো ইউজার API call করলো তখন ডাটা স্টোর করে রাখলাম। এবং এই একই ক্যশ কি টা ব্যবহার করে পরবর্তী ৩০ মিনিট পর্যন্ত ইউজারদেরকে ভিডিও লিস্ট ক্যশ স্টোরেজ থেকে ফেচ করে রেন্ডমলি শাফল করে রিটার্ন করলাম।
ব্যস, পরবর্তী ৩০ মিনিট পর্যন্ত আমার আর ডাটাবেইজে কুয়েরি পড়লো না এবং প্রেসার ও ক্রিয়েট হলো না। এর উপরে আমি যদি সিরিয়ালাইজকৃত ডাটা কে ক্যশ করি তাহলে আমাদের সিরিয়ালাইজেশন স্টেপও ফলো করতে হবে না।
উধাহারন:
Method: GET
API: {domain}/get-videos
NB: আমি Django ইউজ করি তাই ওইভাবেই দেখাচ্ছি, বাট প্রসেস সর্বক্ষেত্রে একই হয়ে থাকে।
class EndPointClass(APIView):
def get(request, section):
"""
Get simple video list for the requested user
"""
videos = model.objects.filter(section=section)
serialized_videos = SerializerClass(videos, many=True).data
return Response(serialized_videos, status=200)
উপরের লাইনগুলোর মধ্য কুয়েরি লাইন হচ্ছে:
videos=model.objects.filter(section=section)
যা রাফলি নিচের SQL এ ট্রান্সলেট হয়:
SELECT
*
FROM
Table_Name
WHERE
section = section_parameter_value
উপরের এন্ডপয়েন্ট টা যতবারই কল হচ্ছে ততবার ডাটাবেইজে কুয়েরি করে সিরিয়ালাইজ করে রিটার্ন করছে যা আমরা আলোচনা করেছি।
ক্যশিং ইন্ট্রডিউস করার পর উপরের এন্ডপয়েন্ট টা কিছুটা নিছের মতো দেখাবে।
class EndPointClass(APIView):
def get(request, section):
"""
Get simple video list for the requested user with caching mechanism
"""
# Cache key
cache_key = f'video_list_{section}'
# Get cached data using cache key
cached_data = cache.get(cache_key)
#If there's cached_data then shuffle and retuen response
if cached_data:
shuffled_data = shuffle(cached_data)
return Response(shuffled_data, status=200)
# Else perform query and fetch videos
videos = model.objects.filter(section=section)
serialized_videos = SerializerClass(videos, many=True).data
# Setting new cache data if no cache data
cache.set(cache_key, serialized_videos, 60*30)
return Response(serialized_videos, status=200)
আমাদের কোড একটু বড় হয়েছে, কিন্তু আমরা ইনসিউর করছি যে আগামী ৩০ মিনিট যেনো ডাটাবেইজে হিট না পড়ে।
Cache সেট করার সময় প্যরামিটার গুলো হচ্ছে cache.set(cache_key, data_to_store, expiration_time)
ক্যশিং ইন্ট্রডিউস করলে যে শুধু কুয়েরি কমবে ওইরকম না।
আপনার রেসপন্স টাইমেও ড্রামাটিক্যালি ইম্প্রুভ হবে।
ধরি ক্যশিং ছাড়া যদি সিংগেল API কল রেসপন্স টাইম : ২০০ms হয়, তাহলে ক্যশিং ইম্পলিমেন্ট করলে তা এসে দাঁড়াবে ৩০-৫০ms এ।
তাহলে এভেরেজ এর কথা আর নাই বা বল্লাম।
ক্যশিং টেকনোলজির মধ্য সবেচেয়ে পপুলার হচ্ছে Redis এরপর আছে RabbitMQ etc.
এখন আরেকটা সিনারিও বলি, ধরি আপনি নতুন একটি ভিডিও আপলোড করেছেন, এবং চাচ্ছেন সেই ভিডিওটা সবাই দেখুক, কিন্তু সমস্যা হচ্ছে আপনার ডাটাবেইজে তো আগামী ৩০ মিনিট পর্যন্ত কুয়েরিই হবে না নতুন ডাটা কিভাবে রিটার্ন করবো, অথবা কিভাবে নতুন ভিডিও কে আমরা ক্যশ এ আপডেট করে রাখতে পারি?
এই সমস্যা সমাধানের জন্য আসে হচ্ছে রাইট থ্রু ক্যশিং মেকানিজম।
Thank you.