Введение в Проблему
Когда API начинает тормозить, одним из первых решений, которое приходит на ум, является добавление Redis или другого внешнего кэша. Однако иногда проблема может быть гораздо проще и заключаться в оптимизации запросов к базе данных. В некоторых случаях база данных, такая как PostgreSQL, может стать узким местом из-за повторяющихся запросов. Например, если тысячи клиентов запрашивают одни и те же данные, это может привести к значительному увеличению нагрузки на базу данных.
Проблема Повторяющихся Запросов
В описанном случае проблема заключалась в том, что практически каждый HTTP-запрос заканчивался одним и тем же SQL-запросом. Это означает, что база данных обрабатывала одни и те же запросы множество раз, что приводило к значительной нагрузке и замедлению работы API. Чтобы решить эту проблему, можно было бы использовать готовое решение, такое как Redis, но в данном случае было решено написать небольшой кэш прямо внутри сервиса.
Реализация Кэша
Реализация кэша заняла примерно полчаса и потребовала около 120 строк кода на языке Go. Этот кэш был предназначен для хранения результатов часто запрашиваемых данных, чтобы избежать повторяющихся запросов к базе данных. Результатом стала значительная оптимизация производительности API, причём некоторые эндпоинты ускорились почти в 7 раз.
Принцип Работы Кэша
Принцип работы кэша прост: когда приходит запрос, кэш проверяет, есть ли уже закэшированный результат для этого запроса. Если есть, кэш возвращает закэшированный результат, не обращаясь к базе данных. Если нет, кэш запрашивает результат у базы данных, кэширует его и возвращает клиенту. Это позволяет избежать повторяющихся запросов к базе данных и значительно уменьшить нагрузку на неё.
Вывод
Реализация кэша может быть простым и эффективным способом оптимизации производительности API, особенно когда проблема заключается в повторяющихся запросах к базе данных. Написание небольшого кэша внутри сервиса может занять немного времени, но результат может быть значительным. В данном случае кэш, написанный на языке Go, позволил ускорить некоторые эндпоинты почти в 7 раз, что является заметным улучшением производительности. Этот подход может быть полезен в различных ситуациях, когда необходимо улучшить производительность API без использования внешних кэшей или сложных решений.