У меня есть клиентское приложение, которое добавляет элементы в корзину. Операция «добавить» запускает запрос обновления через HTTP REST-вызов на удаленную конечную точку. Обратите внимание: этот запрос содержит полную корзину в целом, а не только добавляемый предмет. Затем этот запрос балансируется по нагрузке между двумя серверами, используя арифметику round-robin.Как обрабатывать несколько запросов на обновление на серверах с балансировкой нагрузки
Проблема, которую я пытаюсь решить, заключается в том, что клиент не ждет, пока запрос «добавить» будет возвращен, прежде чем запускать другой запрос «добавить», если пользователь это сделает. Это хорошо с точки зрения конечного пользователя, потому что пользователю не нужно ждать. Но это кошмар с точки зрения сервера: вы не можете быть уверены, в каком порядке запросы будут обработаны из-за балансировки нагрузки.
Вот пример:
- Пользователь добавляет пункт # 1 в корзину. Запрос A отправляется.
- Пользователь добавляет товар №2 в корзину. Запрос B отправляется. Обратите внимание, что запрос B отправляется до того, как запрос A получил ответ.
- Запрос A сбалансирован по нагрузке на сервере 1, а запрос B сбалансирован по нагрузке на сервере 2
- По некоторым причинам сервер 1 работает медленнее, чем сервер 2, так что запрос B обрабатывается первым = > тележка имеет пункт # 1 и # 2
- сервер 1 обрабатывает запрос A => тележка имеет пункт # 1 только (напоминание: каждый запрос обновления содержит Волю корзинку)
Я не так уверенно, как справиться с этим. До сих пор возможные решения, о которых я могу думать, следующие:
- Отправьте временную метку с запросом и сохраните временную метку в базе данных. Прежде чем обновлять корзину, проверьте, что отметка времени запроса выше. В противном случае отмените запрос. Но это в значительной степени зависит от поведения на стороне клиента.
- Установите номер версии на самой тележке и увеличьте ее при каждом обновлении. Это заставит клиента дождаться ответа, прежде чем отправить другое обновление. Не очень удовлетворительно с точки зрения конечного пользователя, потому что он должен ждать.
- Установите «сродство сеанса» на балансировщике нагрузки, чтобы запросы от конкретного клиента были отправлены на один и тот же сервер каждый раз. Проблема в том, что это влияет на баланс загрузки сервера.
Я уверен, что я не первый, кто столкнулся с такой проблемой, но мне не удалось найти подобный случай, довольно удивительно. Вероятно, я должен был задать неправильный вопрос или ключевые слова! Во всяком случае, мне было бы очень интересно поделиться своими мыслями и опытом по этой проблеме.