রাইট থ্রু ক্যশিং মেকানিজম!

শেষ আর্টিকেলের সিকুয়াল এই আর্টিক্যাল টা। যাদের ওইটা পড়া হয়নি সবার শেষে লিংক দিয়ে দিবো।

লাস্ট টাইম আমরা একটা ভিডিও লিস্ট এপিআই এর কথা বলেছি যা খুবই সাধারন একটা ভিডিও লিস্ট রিটার্ন করে। এবং প্রতিটি রিকুয়েষ্ট এর জন্য যাতে ডাটাবেইজে হিট না পড়ে আমরা ক্যশিং টা ইন্ট্রডিউস করি।

এখন এইখানে একটা সমস্যা আছে।

ধরে নিলাম ভিডিও গুলো যে কোনো একজন পাবলিশার পাবলিশ করে থাকে ক্যটেগরিওয়াইজ।

আমাদের ক্যশিং টাইম কিন্তু ৩০ মিনিট, পাবলিশার যদি ৩০ মিনিটের শুরুতে অর্থ্যাৎ নতুন ভাবে ক্যশ স্টোর হবার ২ মিনিট পর ভিডিও পাবলিশ করে তখন কিন্তু আ্যপ ইউজার রা নতুন পাবলিশকৃত ভিডিও আর পাবেনা পরবর্তী ২৮ মিনিট পর্যন্ত।

এইতো মহা ঝামেলা।
পাবলিশার শুরু করবে চিল্লা চিল্লি আমার ভিডিও গেলো কই?

এই সিনারিওগুলোকে সমাধান করার রাস্তা হচ্ছে রাইট থ্রু ক্যশিং।

শব্দ গুলো একটু কঠিন হলেও কাজ একদম সহজ।

আগের ক্যশ সেটের কাজটাই করতে হবে, কিন্তু এইবার আর আমরা শুধু এপিআই এর মধ্য ক্যশ সেট করবো না যখন ইউজার রিকুয়েষ্ট করবে।

এপিআইএর পুরনো কোড যেভাবে আছে থাকুক, এইটা ফেইল সেফ এর কাজ করবে

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 করেও হয় তাহলে ক্যশ সাইজ দাঁড়াবে : ৩৮.১৫ গিগাবাইট [ক্যলকুলেশন ভুল হতে পারে]।

সেক্ষেত্রে উপায় কি? আমরা যদি ৩০ মিনিটের এক্সপায়ারেশন টাইম আবার আনিও তাও কি লাভ হবে? কারন দেখা গেলো যে একই সাথে ১ লাখ ইউজারে ক্যশ এক্সপায়ার হয়ে গেছে তখন কি করবো?

আগের আর্টিকেল/পোস্ট :

3 Likes

Really good techniques! I’m already working on a system like that. I think I’ll be thinking in a new way to cache my data. But one thing to be concerned with is what about pagination? When data is pulling in pagination format, what will be the good caching mechanism?

Eagerly waiting for next article. Thanks

1 Like

Sure vai, but still oto valo response nei. Maybe topic ektu uncommon.

1 Like

New platform may be ejonno.

ক্যশ ডিস্কে করলে যদি কনকারেন্ট ব্যবহারকারী বেড়ে যায় তবে সার্ভারের ডিস্কে ইনপুট আউটপুট প্রসেসও বেড়ে যায়। সেটাও চিন্তার বিষয়।

1 Like

Ji, tai last point e ei issue ta open ended point out korechi.

ক্যশিং নিয়ে কিছু জটিলতা এবং সম্ভাব্য সমাধান। Disk er issue niye likhechi vaiya eikhane, but still optimal na

2 Likes