2016-10-08 2 views
2

У меня есть клиентское приложение, которое добавляет элементы в корзину. Операция «добавить» запускает запрос обновления через HTTP REST-вызов на удаленную конечную точку. Обратите внимание: этот запрос содержит полную корзину в целом, а не только добавляемый предмет. Затем этот запрос балансируется по нагрузке между двумя серверами, используя арифметику round-robin.Как обрабатывать несколько запросов на обновление на серверах с балансировкой нагрузки

Проблема, которую я пытаюсь решить, заключается в том, что клиент не ждет, пока запрос «добавить» будет возвращен, прежде чем запускать другой запрос «добавить», если пользователь это сделает. Это хорошо с точки зрения конечного пользователя, потому что пользователю не нужно ждать. Но это кошмар с точки зрения сервера: вы не можете быть уверены, в каком порядке запросы будут обработаны из-за балансировки нагрузки.

Вот пример:

  • Пользователь добавляет пункт # 1 в корзину. Запрос A отправляется.
  • Пользователь добавляет товар №2 в корзину. Запрос B отправляется. Обратите внимание, что запрос B отправляется до того, как запрос A получил ответ.
  • Запрос A сбалансирован по нагрузке на сервере 1, а запрос B сбалансирован по нагрузке на сервере 2
  • По некоторым причинам сервер 1 работает медленнее, чем сервер 2, так что запрос B обрабатывается первым = > тележка имеет пункт # 1 и # 2
  • сервер 1 обрабатывает запрос A => тележка имеет пункт # 1 только (напоминание: каждый запрос обновления содержит Волю корзинку)

Я не так уверенно, как справиться с этим. До сих пор возможные решения, о которых я могу думать, следующие:

  • Отправьте временную метку с запросом и сохраните временную метку в базе данных. Прежде чем обновлять корзину, проверьте, что отметка времени запроса выше. В противном случае отмените запрос. Но это в значительной степени зависит от поведения на стороне клиента.
  • Установите номер версии на самой тележке и увеличьте ее при каждом обновлении. Это заставит клиента дождаться ответа, прежде чем отправить другое обновление. Не очень удовлетворительно с точки зрения конечного пользователя, потому что он должен ждать.
  • Установите «сродство сеанса» на балансировщике нагрузки, чтобы запросы от конкретного клиента были отправлены на один и тот же сервер каждый раз. Проблема в том, что это влияет на баланс загрузки сервера.

Я уверен, что я не первый, кто столкнулся с такой проблемой, но мне не удалось найти подобный случай, довольно удивительно. Вероятно, я должен был задать неправильный вопрос или ключевые слова! Во всяком случае, мне было бы очень интересно поделиться своими мыслями и опытом по этой проблеме.

ответ

0

Самый простой способ - отправить данные операции (добавлено # 1, добавлено # 2 ...), чтобы восстановить корзину на инкрементном пути на серверах. С этой информацией вы не полагаетесь на запросы, обрабатываемые в определенном порядке вообще.

Если вы не можете изменить API, ваше третье решение (обработка одного и того же сеанса на одном и том же сервере в течение всего его продолжительности), вероятно, будет способом, без дополнительной информации о вашей ожидаемой нагрузке по счету клиента/клиента ,