ऐपसिग्नल का उपयोग करने वाले ऐप को चलाने वाला हर सर्वर हर 30 सेकंड में सैंपल और मेट्रिक्स का एक संग्रह हमारे पुश API को भेजता है।
प्रत्येक अनुरोध में एक कुंजी होती है जिसका उपयोग हम यह निर्धारित करने के लिए करते हैं कि डेटा किस ऐप से आया है। ऐसा करने के लिए, हमें अपने डेटाबेस को क्वेरी करना होगा ताकि प्रत्येक आने वाले अनुरोध के लिए ऐप ढूंढा जा सके। प्रति माह तीस अरब अनुरोधों के साथ, हम ऐपसिग्नल को तेज़ बनाने के लिए क्वेरी की संख्या को कम करने के तरीके लगातार खोज रहे हैं।
हमने अपने डेटाबेस क्लस्टर पर क्वेरी की संख्या को कम करने के लिए कैशिंग लागू की। जब भी हम डेटाबेस से एक ऐप लाते हैं, हम इसे एक मिनट के लिए मेमकैश्ड में संग्रहीत करते हैं। इस बदलाव को उत्पादन में तैनात करने के बाद, हमने पाया कि हम पहले से अधिक क्वेरी कर रहे थे। ऐसा लग रहा था कि कैश बहुत बार अमान्य हो रहा था। यह पता लगाने के लिए कि ऐसा कहां हुआ, हमने कुछ कस्टम मेट्रिक्स जोड़े ताकि पता लगा सकें कि कैश को अनुचित तरीके से कहां अमान्य किया गया था।
कुछ स्थान हैं जहां हम कैश को अमान्य करते हैं, जैसे जब पुश प्रोसेस्ड समय अपडेट होता है या जब हम एक नया नेमस्पेस डिटेक्ट करते हैं।
# अंतिम पुश प्रोसेस्ड समय अपडेट करें यदि
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 का उपयोग विशिष्ट अमान्यताओं के लिए करते हैं।
# अंतिम पुश प्रोसेस्ड समय अपडेट करें
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 के रूप में गिनी जाती है।
इस मुद्दे के लिए एक फिक्स तैनात करने के बाद, अमान्यताओं की संख्या शून्य हो गई जब तक कि ऐप के लिए नेमस्पेस अपडेट नहीं किए गए।
कस्टम मेट्रिक्स जोड़ने से यह समझना आसान हो जाता है कि क्या हो रहा है, कब, और कितनी बार। इस मामले में, कैश अमान्यताओं की संख्या जानना और उन्हें पठनीय ग्राफ में दिखाना हमें जल्दी से एक मुद्दा खोजने की अनुमति देता है। इसमें बस कोड की कुछ लाइनें लगती हैं एक निश्चित मान को बढ़ाने और एक डैशबोर्ड बनाने के लिए।
हमें बताएं यदि कस्टम मेट्रिक्स के बारे में आपके कोई प्रश्न हैं और यदि हम उन्हें आपके एप्लिकेशन में सेट अप करने में आपकी मदद कर सकते हैं। हम मदद करने में खुश हैं!