Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

ติดตามแคชฮิตด้วยเมตริกที่กำหนดเอง

ทุกเซิร์ฟเวอร์ที่ใช้งานแอปที่ใช้ AppSignal จะส่งกลุ่มตัวอย่างและเมตริกไปยัง Push API ของเราทุกๆ 30 วินาที

คำขอแต่ละรายการมีคีย์ที่เราใช้เพื่อกำหนดว่าข้อมูลมาจากแอปใด ในการทำเช่นนั้น เราจำเป็นต้องสืบค้นฐานข้อมูลของเราเพื่อค้นหาแอพสำหรับคำขอที่เข้ามาแต่ละรายการ ด้วยคำขอ 3 หมื่นล้านรายการต่อเดือน เราพยายามค้นหาวิธีลดจำนวนการสืบค้นข้อมูลเพื่อทำให้ AppSignal เร็วขึ้น

เราใช้การแคชเพื่อลดจำนวนการสืบค้นในกลุ่มฐานข้อมูลของเรา เมื่อใดก็ตามที่เราดึงแอปจากฐานข้อมูล เราจะเก็บไว้ใน Memcached เป็นเวลาหนึ่งนาที หลังจากปรับใช้การเปลี่ยนแปลงนี้กับเวอร์ชันที่ใช้งานจริง เราพบว่าเรากำลังดำเนินการเพิ่มเติม แบบสอบถามมากกว่าเดิม ดูเหมือนว่าแคชจะใช้งานไม่ได้บ่อยเกินไป เพื่อค้นหาว่าเกิดอะไรขึ้น เราได้เพิ่มตัววัดแบบกำหนดเองบางตัวเพื่อค้นหาตำแหน่งที่แคชใช้งานไม่ได้อย่างไม่เหมาะสม

มีบางจุดที่เราทำให้แคชใช้งานไม่ได้ เช่น เมื่อมีการอัปเดตเวลาในการประมวลผลแบบพุชหรือเมื่อเราตรวจพบเนมสเปซใหม่

# 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

การเพิ่มเมตริกที่กำหนดเองด้านบน ทำให้เราสามารถสร้างกราฟ Hit ของแคชเมื่อเวลาผ่านไป ปรากฏชัดในทันทีว่าคีย์แคชใดทำให้เกิดการสืบค้นเพิ่มขึ้น app.cache.invalidate_namespaces คีย์ไม่ถูกต้องสำหรับแต่ละคำขอ

จำนวนคำขอแคชทั้งหมดนับเป็น app.cache.maybe .

หลังจากปรับใช้การแก้ไขปัญหานี้ จำนวนการทำให้เป็นโมฆะเป็นศูนย์ ตราบใดที่เนมสเปซสำหรับแอปไม่ได้รับการอัปเดต

การเพิ่มเมตริกที่กำหนดเองช่วยให้เข้าใจได้ง่ายขึ้นว่าเกิดอะไรขึ้นที่ไหน เมื่อไร และบ่อยเพียงใด ในกรณีนี้ การทราบจำนวนการทำให้แคชใช้ไม่ได้และแสดงเป็นกราฟที่อ่านได้ช่วยให้เราค้นหาปัญหาได้อย่างรวดเร็ว ต้องใช้โค้ดสองสามบรรทัดเพื่อเพิ่มค่าและสร้างแดชบอร์ด

แจ้งให้เราทราบหากคุณมีคำถามใดๆ เกี่ยวกับตัววัดที่กำหนดเอง และถ้าเราสามารถช่วยคุณตั้งค่าในใบสมัครของคุณได้ เรายินดีให้ความช่วยเหลือ!