MCP Server Caching: สิ่งที่ผมได้เรียนรู้หลังจากระบบล่มไป 87 ครั้ง
ผมเคยคิดว่า MCP server ของผมไม่จำเป็นต้องมี caching
ฐานความรู้ (knowledge base) ของผมมีข้อมูลเพียงไม่กี่พันรายการ การค้นหา (queries) ก็รวดเร็วดี ผมคิดผิดครับ
หลังจากระบบล่มในสภาพแวดล้อมจริง (production) ไปถึง 87 ครั้ง และต้องใช้เวลาแก้ปัญหาเรื่อง timeout นานถึงสามวัน ผมก็ได้บทเรียนราคาแพง ทุก MCP server จำเป็นต้องมี caching แม้จะเป็นเซิร์ฟเวอร์ขนาดเล็กก็ตาม
นี่คือสิ่งที่เกิดขึ้น
เซิร์ฟเวอร์ใช้ semantic search ในการค้นหาโน้ต ซึ่งส่วนใหญ่ก็ทำงานได้ปกติ แต่แล้วปัญหาเริ่มเกิด
- การเชื่อมต่อหลุดระหว่างการส่งคำขอ (request)
- Claude Desktop เกิด timeout หลังจากผ่านไป 60 วินาที
- Nginx ส่งคืนข้อผิดพลาด 504 Gateway Timeouts
ส่วนที่แย่ที่สุดน่ะเหรอ? มันเกิดขึ้นเฉพาะกับการค้นหาซ้ำๆ เท่านั้น
เมื่อผู้ใช้ถามคำถามเดิมซ้ำสองครั้ง การเชื่อมต่ออาจจะอยู่ในสถานะ idle ในขณะที่ AI กำลังประมวลผล จากนั้น proxy ก็จะตัดการเชื่อมต่อทิ้ง ทำให้ Claude พยายามส่งคำขอใหม่ (retry) โดยอัตโนมัติ ทีนี้คุณก็จะมีกระบวนการค้นหาที่เหมือนกันเป๊ะสองอย่างทำงานพร้อมกัน
เมื่อมีการ retry เกิดขึ้นหลายครั้ง connection pool ของฐานข้อมูลก็จะเต็ม และทุกอย่างก็พังลง
ผมตระหนักได้ว่าผมไม่ควรทำ caching กับคำตอบสุดท้ายของ AI เพราะมันซับซ้อนเกินไปสำหรับ MCP แต่ผมควรทำ caching ในส่วนที่หนักหน่วงแทน นั่นคือส่วนของ semantic search และการดึงข้อมูลเนื้อหา (content fetching)
ผมจึงเปลี่ยนมาใช้กลยุทธ์การทำ caching แบบสองระดับ:
• ระดับ 1: In-memory cache สำหรับการค้นหาที่เกิดขึ้นบ่อย ซึ่งเร็วมาก • ระดับ 2: Redis cache สำหรับข้อมูลที่ต้องใช้ร่วมกันแม้จะมีการ restart เซิร์ฟเวอร์
ผมยังปฏิบัติตามกฎเหล่านี้เพื่อให้มันใช้งานได้จริง:
- Normalize queries: ผมแปลงคำค้นหาให้เป็นตัวพิมพ์เล็กและลบช่องว่างส่วนเกินออก วิธีนี้จะช่วยเพิ่มอัตรา cache hits
- Cache results, not streams: ผมทำ caching เฉพาะผลลัพธ์การค้นหาเท่านั้น เพราะขั้นตอนการค้นหาใช้เวลาไปถึง 95%
- Graceful degradation: หาก Redis ล่ม เซิร์ฟเวอร์ก็ยังทำงานได้ โดยจะไปดึงข้อมูลจากฐานข้อมูลโดยตรง การทำ caching คือการเพิ่มประสิทธิภาพ (optimization) ไม่ใช่เงื่อนไขบังคับเพื่อให้คำขอสำเร็จ
ผลลัพธ์ที่ได้นั้นมหาศาลมาก
เวลาเฉลี่ยในการค้นหาของผมลดลงจาก 320ms เหลือเพียง 12ms ซึ่งเร็วขึ้นถึง 27 เท่า! อัตรา cache hit รวมอยู่ที่ 73% หมายความว่าคำขอส่วนใหญ่ไม่ต้องไปแตะฐานข้อมูลของผมเลยด้วยซ้ำ
หากคุณกำลังสร้าง MCP server ให้ทำดังนี้:
- สำหรับการใช้งานส่วนตัว: ใช้ in-memory cache เพื่อป้องกันปัญหา timeout แบบสุ่ม
- สำหรับบริการสาธารณะ: ใช้แนวทางแบบสองระดับร่วมกับ Redis เพื่อป้องกันระบบล่มและเพิ่มความเร็ว
การทำ caching คือเรื่องของความน่าเชื่อถือ (reliability) มันช่วยหยุดวงจรของการ retry และความล้มเหลวในการเชื่อมต่อ
ชุมชนแห่งการเรียนรู้เพิ่มเติม: https://t.me/GyaanSetuAi
