Кэширование MCP-серверов: чему я научился после 87 сбоев
Я думал, что моему MCP-серверу не нужно кэширование.
В моей базе знаний было всего несколько тысяч записей. Запросы выполнялись быстро. Я ошибался.
После 87 сбоев в продакшене и трех дней отладки таймаутов я усвоил тяжелый урок. Каждому MCP-серверу нужно кэширование. Даже маленьким.
Вот что произошло.
Сервер использовал семантический поиск для нахождения заметок. В большинстве случаев всё работало. Но потом начались проблемы.
- Соединения обрывались посреди запроса.
- Claude Desktop выдавал таймаут через 60 секунд.
- Nginx возвращал ошибку 504 Gateway Timeout.
Самое худшее? Это происходило только при повторных запросах.
Когда пользователь задает один и тот же вопрос дважды, соединение может простаивать, пока ИИ думает. Затем прокси-сервер разрывает соединение. Claude автоматически повторяет запрос. В итоге у вас одновременно запускаются два идентичных поиска.
Когда происходит несколько повторных попыток, пул соединений с базой данных исчерпывается. Всё падает.
Я понял, что не стоит кэшировать финальный ответ ИИ. Для MCP это слишком сложно. Вместо этого мне нужно было кэшировать самую тяжелую часть: семантический поиск и получение контента.
Я перешел на двухэтапную стратегию кэширования:
• Уровень 1: In-memory кэш для частых запросов. Это работает чрезвычайно быстро. • Уровень 2: Кэш Redis для общих данных между перезапусками.
Чтобы это работало, я также следовал следующим правилам:
- Нормализация запросов: я перевожу запросы в нижний регистр и удаляю лишние пробелы. Это увеличивает количество попаданий в кэш.
- Кэшируйте результаты, а не потоки: я кэширую только результаты поиска. Поиск занимает 95% времени.
- Постепенная деградация: если Redis упадет, сервер продолжит работу. Он просто будет обращаться напрямую к базе данных. Кэширование — это оптимизация, а не обязательное условие для успешного выполнения запроса.
Результаты были колоссальными.
Мое среднее время поиска сократилось с 320 мс до 12 мс. Это в 27 раз быстрее. Общий показатель попадания в кэш составляет 73%. Большинство запросов вообще не доходят до моей базы данных.
Если вы создаете MCP-сервер, сделайте следующее:
- Для личного использования: используйте in-memory кэш. Это предотвратит случайные таймауты.
- Для публичных сервисов: используйте двухэтапный подход с Redis. Это предотвратит сбои и повысит скорость.
Кэширование — это вопрос надежности. Оно прерывает цикл повторных попыток и разрывов соединений.
Optional learning community: https://t.me/GyaanSetuAi
