Кешування MCP-сервера: чого я навчився після 87 збоїв
Я думав, що мій MCP-сервер не потребує кешування.
Моя база знань мала лише кілька тисяч записів. Запити були швидкими. Я помилявся.
Після 87 збоїв у продакшені та трьох днів налагодження тайм-аутів я засвоїв важкий урок. Кожному MCP-серверу потрібне кешування. Навіть маленьким.
Ось що сталося.
Сервер використовував семантичний пошук для пошуку нотаток. Більшість часу все працювало. Але потім почалися проблеми.
- З'єднання розривалися посеред запиту.
- Claude Desktop видавав тайм-аут через 60 секунд.
- Nginx повертав 504 Gateway Timeout.
Найгірше? Це траплялося лише під час повторних запитів.
Коли користувач двічі ставить одне й те саме питання, з'єднання може простоювати, поки ШІ думає. Потім проксі розриває з'єднання. Claude автоматично повторює запит. Тепер у вас одночасно виконуються два ідентичні пошуки.
Коли стається кілька повторних спроб, пул з'єднань з базою даних вичерпується. Усе «падає».
Я зрозумів, що не варто кешувати фінальну відповідь ШІ. Для MCP це занадто складно. Замість цього мені потрібно було кешувати найважчу частину: семантичний пошук і отримання контенту.
Я перейшов на дворівневу стратегію кешування:
• Рівень 1: In-memory кеш для частих запитів. Це надзвичайно швидко. • Рівень 2: Redis кеш для спільних даних між перезапусками.
Я також дотримувався цих правил, щоб усе працювало:
- Нормалізуйте запити: я переводжу запити в нижній регістр і видаляю зайві пробіли. Це збільшує кількість збігів у кеші (cache hits).
- Кешуйте результати, а не потоки: я кешую лише результати пошуку. Пошук займає 95% часу.
- Поступова деградація: якщо Redis виходить з ладу, сервер продовжує працювати. Він просто звертається безпосередньо до бази даних. Кешування — це оптимізація, а не обов'язкова умова для успішного виконання запиту.
Результати були колосальними.
Мій середній час пошуку скоротився з 320 мс до 12 мс. Це у 27 разів швидше. Мій загальний показник cache hit rate становить 73%. Більшість запитів взагалі не звертаються до моєї бази даних.
Якщо ви створюєте MCP-сервер, зробіть наступне:
- Для особистого використання: використовуйте in-memory кеш. Це запобігає випадковим тайм-аутам.
- Для публічних сервісів: використовуйте дворівневий підхід із Redis. Це запобігає збоям і підвищує швидкість.
Кешування — це про надійність. Воно перериває цикл повторних спроб і розривів з'єднання.
Додаткова спільнота для навчання: https://t.me/GyaanSetuAi
