Кэширование 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. Это предотвратит сбои и повысит скорость.

Кэширование — это вопрос надежности. Оно прерывает цикл повторных попыток и разрывов соединений.

Source: https://dev.to/kevinten10/mcp-server-caching-what-i-learned-adding-caching-to-my-mcp-knowledge-base-after-87-production-261b

Optional learning community: https://t.me/GyaanSetuAi