Я пытаюсь понять, какая из них будет лучшей стратегией кэша в случае слоя REST API, который позволяет запрашивать и обновлять базу данных реестра клиентов. В настоящее время у нас есть 3 фронтовых сервера, которые говорят с центральным сервером базы данных.Согласованность с etags и настройкой нескольких серверов?
Идея состоит в том, чтобы возвратить etag вызывающему клиенту с помощью этага, соответствующего идентификатору версии записи клиента (хеш-значение, которое обновляется при любых изменениях в учетной записи), с призывами на обновление, принятыми только в том случае, если полученный этаг соответствует Идентификатор версии, хранящийся в базе данных.
Предположим, что клиент выполняет GET для записи клиента, направляемой на сервер 1 балансировщиком нагрузки. На сервере 1 нет кэша записи клиента, поэтому он будет запрашивать базу данных, кэшировать запись локально и возвращать запись в качестве ответа на вызов, включая заголовок etag.
Если второй клиент прибыл и выполнил одно и то же GET для той же самой записи клиента, направляемой на сервер 2, сервер 2 также будет кэшировать запись локально и вернуть тот же заголовок etag.
Предположим, что теперь первый клиент выполнил вызов обновления с той же записью через сервер 1. Кэш сервера 1 обновляется с последней информацией о записи, и первый клиент получает новый etag.
После этого второй клиент выполняет условный вызов get, предоставляющий заголовок «If-None-Match» с принятым этагом. Запрос снова ударит по серверу 2. Мое предположение состоит в том, что сервер 2 все еще будет кэшировать старый etag и вернет 304 Not Notified ответ клиенту. Это правильное предположение?
В этой ситуации клиент может легко получить устаревшие данные и повлияет на общую согласованность данных, видимых и используемых на стороне клиента.
Что необходимо для решения этой проблемы и обеспечения того, чтобы в прошлые периоды времени клиентам не возвращались никакие устаревшие данные о записи клиента?
Большое спасибо!
вы можете прокомментировать мой ответ. :)) –