Кэширование данных в коде приложения обычно является хорошей идеей по многим причинам. Некоторое время мы делаем это в нашей общей среде, которая включает ColdFusion, .NET и PHP. Однако, поскольку мы разделяем эту среду со многими другими группами разработчиков в нашей организации, простоев значительно больше, чем мы (или наши клиенты) ценим.
Поэтому наши веб-администраторы переходят к внедрению новой среды. В этой среде они добавляют уровень QA между текущими средами Dev и Prod. Кроме того, чтобы увеличить время безотказной работы, они объединяют машины в кластеры как на уровне QA, так и на уровне Prod.
Все это здорово по многим причинам. Единственная проблема, в которой я вижу проблему, - это кеширование. Будет два (или больше, в зависимости от количества узлов) наборов кеша. Как вы понимаете, это создает следующую потенциальную проблему. Кеш одинаков на узлах A и B. Пользователь 1 обновляет данные и, таким образом, кеш обновляется на узле A. Пользователь 2 приходит с запросом данных, но находится на узле B и, следовательно, получает старые данные.
Есть ли у них какие-либо лучшие практики, как с этим справиться?
Могу ли я внести какие-либо изменения в свой код?
Есть ли настройки сервера, которые можно реализовать?
Вы не говорите точно, что и как кэшируется, поэтому мы будем снимать немного в темноте.
Типичное решение с кластерным кешем позаботится о том, чтобы все члены кластера имели согласованное представление данных. Например, memcached - это обычное решение для кэширования данных приложений, и обновление от одного члена кластера будет немедленно видно другим членам кластера.
Если вы кэшируете сгенерированные веб-страницы, решение обычно состоит в том, чтобы кэшировать только те данные, которые либо инвариантны, либо имеют четко определенное время истечения срока действия. Данные, которые различаются в зависимости от запроса, часто не кэшируются. Это дает веб-приложению повышение производительности, поскольку выборка для общих элементов, таких как изображения, таблицы стилей и javascript, может поступать из кеша, в то время как пользовательский HTML-код извлекается из серверной части. Кроме того, некоторые решения могут сделать кеш недействительным, если данные, используемые для создания страницы, изменились.
Вы точно знаете, как происходит кластеризация? Например, если вы «кластеризуете» свои веб-серверы, закрепляя группу за аппаратным балансировщиком нагрузки, клиенты будут поддерживать свое соединение с одним резервным сервером, поэтому проблем с кэшированием не возникнет.