শেষ আর্টিকেলের সিকুয়াল এই আর্টিক্যাল টা। যাদের ওইটা পড়া হয়নি সবার শেষে লিংক দিয়ে দিবো।
লাস্ট টাইম আমরা একটা ভিডিও লিস্ট এপিআই এর কথা বলেছি যা খুবই সাধারন একটা ভিডিও লিস্ট রিটার্ন করে। এবং প্রতিটি রিকুয়েষ্ট এর জন্য যাতে ডাটাবেইজে হিট না পড়ে আমরা ক্যশিং টা ইন্ট্রডিউস করি।
এখন এইখানে একটা সমস্যা আছে।
ধরে নিলাম ভিডিও গুলো যে কোনো একজন পাবলিশার পাবলিশ করে থাকে ক্যটেগরিওয়াইজ।
আমাদের ক্যশিং টাইম কিন্তু ৩০ মিনিট, পাবলিশার যদি ৩০ মিনিটের শুরুতে অর্থ্যাৎ নতুন ভাবে ক্যশ স্টোর হবার ২ মিনিট পর ভিডিও পাবলিশ করে তখন কিন্তু আ্যপ ইউজার রা নতুন পাবলিশকৃত ভিডিও আর পাবেনা পরবর্তী ২৮ মিনিট পর্যন্ত।
এইতো মহা ঝামেলা।
পাবলিশার শুরু করবে চিল্লা চিল্লি আমার ভিডিও গেলো কই?
এই সিনারিওগুলোকে সমাধান করার রাস্তা হচ্ছে রাইট থ্রু ক্যশিং।
শব্দ গুলো একটু কঠিন হলেও কাজ একদম সহজ।
আগের ক্যশ সেটের কাজটাই করতে হবে, কিন্তু এইবার আর আমরা শুধু এপিআই এর মধ্য ক্যশ সেট করবো না যখন ইউজার রিকুয়েষ্ট করবে।
এপিআইএর পুরনো কোড যেভাবে আছে থাকুক, এইটা ফেইল সেফ এর কাজ করবে
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, None)
return Response(serialized_videos, status=200)
এখন নতুন কোডে আমরা ক্যশটা সেট করবো হচ্ছে পাবলিশার যখন ভিডিও পাবলিশ করবে তখন
class PublishVudeo(APIView):
def get(request):
........
def post(request):
"""
Post method for publishing new videos
"""
# Get the post data
data = request.POST
# Get video section and publish status
video_section = data.get("section", "default_section")
is_published = data.get("is_published", "false") == "true"
msg = "Video wasn’t published"
if is_published:
# Cache key
cache_key = f'video_list_{section}'
# Fetch videos of the given section
videos = model.objects.filter(section=section)
serialized_videos = SerializerClass(videos, many=True).data
# Setting new cache data
cache.set(cache_key, serialized_videos, None)
msg = "Video published"
return JsonResponse({"message": msg})
একটা নোটেবল মডিফিকেশন করেছি এইখানে আমি, ক্যশ এক্সপায়ার টাইম None
Set করে দিয়েছি যাতে ক্যশ গুলো কখনো এক্সপায়ার না হয়। এতে করে হবে কি, শুধু মাত্র নতুন ভিডিও পাবলিশ হবার পরেই ডাটাবেইজে হিট পরবে এর আগে না।
শুধু ক্যশিং ইম্পলিমেন্ট করলেই যে কাজ হয়ে যাবে এমন না, ডাটাবেইজ অপটিমাইজেশন এর নানা পায়তারা আছে যা ব্যবহার করলে আপনার কুয়েরি গুলোও অনেক ফাস্ট এবং কম লোড ক্রিয়েট করবে, পাশাপাশি ডাটা ট্রান্সফার রেট, ফেচ রেট ইত্যাদিও কমে যাবে।
কুয়েরি এক্সিকিউশন টাইম এবং ডাটাবেইজের লোড অপটিমাইজেশন নিয়ে নাহয় অন্য একদিন কথা বলি, বা রেসপন্স না পেলে এইখানেই শেষ।
আরও একটা টপিকের লেজ গজিয়ে যাই।
আমাদের আ্যপ অনেক ডেভেলপ হয়েছে ইউজার সিস্টেম এসেছে, তাই আমরা আর সাধা সিধে ভিডিও লিস্ট দেখাই না সবাইকে। সবার জন্য ভিন্ন ভিন্ন ভাবে তৈরি করা ভিডিও লিস্ট দেখাই, বা বলতে পারেন ইউজারের টেস্ট অনুযায়ী ভিডিও দেখাই।
স্টিল আমরা ক্যশিং টা রাখলাম যাতে ডাটাবেইজে হিট না পড়ে। কিন্তু সমস্যা এখন আর ডাটাবেইজ লোডে নেই, সমস্যা এখন ক্যশিং নিয়ে।
ধরে নেই আমাদের ইউজার বেইজ ১ মিলিয়ন, যার মধ্যে একটিভ ইউজার ৪ লাখ। আর প্রত্যেক টা ইউজারের বিপরীতে একটা করে ভিডিও লিস্ট ক্যশ করা আছে।
এখন প্রতিটি ক্যশড ভিডিও লিস্ট যদি ১০০kb করেও হয় তাহলে ক্যশ সাইজ দাঁড়াবে : ৩৮.১৫ গিগাবাইট [ক্যলকুলেশন ভুল হতে পারে]।
সেক্ষেত্রে উপায় কি? আমরা যদি ৩০ মিনিটের এক্সপায়ারেশন টাইম আবার আনিও তাও কি লাভ হবে? কারন দেখা গেলো যে একই সাথে ১ লাখ ইউজারে ক্যশ এক্সপায়ার হয়ে গেছে তখন কি করবো?
আগের আর্টিকেল/পোস্ট :