অ্যাপসিগন্যাল ব্যবহার করে একটি অ্যাপ রান করা প্রতিটি সার্ভার প্রতি ৩০ সেকেন্ডে আমাদের পুশ API-তে স্যাম্পল এবং মেট্রিক্সের একটি কালেকশন পাঠায়।
প্রতিটি রিকোয়েস্টে একটি কী থাকে যা আমরা ব্যবহার করি নির্ধারণ করতে কোন অ্যাপ থেকে ডেটা আসছে। সেটি করার জন্য, আমাদের ডেটাবেস কোয়ারী করতে হয় প্রতিটি ইনকামিং রিকোয়েস্টের জন্য অ্যাপ খুঁজে বের করতে। ত্রিশ বিলিয়ন রিকোয়েস্ট প্রতি মাসে, আমরা باستمرار চেষ্টা করি কোয়ারী কমাতে অ্যাপসিগন্যাল দ্রুত করতে।
আমরা ক্যাশিং ইমপ্লিমেন্ট করেছি ডেটাবেস ক্লাস্টারের ওপর কোয়ারী কমাতে। যখনই আমরা ডেটাবেস থেকে একটি অ্যাপ ফেচ করি, আমরা সেটি মেমক্যাশডে এক মিনিটের জন্য স্টোর করি। এই চেঞ্জ প্রোডাকশনে ডিপ্লয় করার পর, আমরা দেখলাম আমরা আগের চেয়ে অধিক কোয়ারী করছি। লাগছে ক্যাশ খুব বেশি ইনভ্যালিডেট হচ্ছে। কোথায় সেটি হচ্ছে সেটা বের করতে, আমরা কিছু কাস্টম মেট্রিক্স যোগ করেছি ক্যাশ অপ্রপারলি ইনভ্যালিডেট হচ্ছে কোথায় সেটা বের করতে।
কয়েকটি জায়গা আছে যেখানে আমরা ক্যাশ ইনভ্যালিডেট করি, যেন যখন পুশ প্রসেসড টাইম আপডেট হয় বা যখন আমরা একটি নতুন নেমস্পেস ডিটেক্ট করি।
# Update last push processed at time
if app.last_push_processed_at < 5.minutes.ago
app.set(:last_push_processed_at => Time.now)
Rails.cache.delete(cache_key)
end
if namespaces_diff.any?
app.add_to_set(:namespaces => namespaces_diff)
Rails.cache.delete(cache_key)
end
আমরা একাধিক কাউন্টার যোগ করেছি নির্ধারণ করতে এই ক্যাশ ইনভ্যালিডেশনগুলোর কোনটি কলপ্রিট। এই উদাহরণে আমরা app.cache.invalidate কাউন্টার ইনক্রিমেন্ট করি টোটাল ইনভ্যালিডেশনের সংখ্যা কাউন্ট করতে, এবং স্পেসিফিক কী যেমন app.cache.invalidate_push_time এবং app.cache.invalidate_namespaces স্পেসিফিক ইনভ্যালিডেশনর জন্য।
# Update last push processed at at time
if app.last_push_processed_at < 5.minutes.ago
app.set(:last_push_processed_at => Time.now)
Rails.cache.delete(cache_key)
Appsignal.increment_counter('app.cache.invalidate', 1)
Appsignal.increment_counter('app.cache.invalidate_push_time', 1)
end
if namespaces_diff.any?
app.add_to_set(:namespaces => namespaces_diff)
Rails.cache.delete(cache_key)
Appsignal.increment_counter('app.cache.invalidate', 1)
Appsignal.increment_counter('app.cache.invalidate_namespaces', 1)
end
উপরের কাস্টম মেট্রিক্স যোগ করলে, আমরা আমাদের ক্যাশ হিটসময়ের সাথে গ্রাফ করতে পারলাম। তৎক্ষণাৎ স্পষ্ট হয়ে গেল কোন ক্যাশ কী কোয়ারী বৃদ্ধির কারণ ছিল। app.cache.invalidate_namespaces কী প্রতিটি রিকোয়েস্টের জন্য ইনভ্যালিডেট হচ্ছিল।
টোটাল ক্যাশেবল রিকোয়েস্টের সংখ্যা app.cache.maybe হিসেবে কাউন্ট হয়।
এই ই슈র জন্য একটি ফিক্স ডিপ্লয় করার পর, ইনভ্যালিডেশনের সংখ্যা শূন্যে নামে গেল যতক্ষণ না একটি অ্যাপের নেমস্পেস আপডেট হয়।
কাস্টম মেট্রিক্স যোগ করলে বুঝতে সহজ হয় কী হচ্ছে কোথায়, কখন, এবং কতবার। এই কেসে, ক্যাশ ইনভ্যালিডেশনের সংখ্যা জানা এবং সেগুলো একটি রিডেবল গ্রাফে দেখানো আমাদের দ্রুত একটি ইস্যু খুঁজে বের করতে সাহায্য করল। এটা শুধু কয়েক লাইন কোড লাগে একটি নির্দিষ্ট ভ্যালু ইনক্রিমেন্ট করতে এবং একটি ড্যাশবোর্ড তৈরি করতে।
আমাদের জানান আপনার কাস্টম মেট্রিক্স নিয়ে কোনো প্রশ্ন আছে কিনা এবং আমরা আপনাকে সেটাপ করতে সাহায্য করতে পারি কিনা আপনার অ্যাপ্লিকেশনে। আমরা সাহায্য করতে খুশি হব!