Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
предисловие
Сегодня я поделюсь с вами некоторыми знаниями об идемпотентности в распределенном распределении, которая относится к основе и фокусу распределенного распределения.Изучив эту статью, вы сможете получить следующие знания:
- Что такое идемпотентность
- Зачем гарантировать идемпотентность
- Как обеспечить идемпотентность
Что такое идемпотентность?
Чтобы привести конкретный пример, например, в системе seckill для продукта seckill кнопка заказа инициируется несколько раз.Для интерфейса заказа интерфейс должен гарантировать, что может быть вставлена только одна запись заказа, а инвентарь может только вычитается один раз Это идемпотентность.
Почему гарантируется идемпотентность?
Для одномашинной системы развертывания мы можем добавить карту в память.После получения клиентского запроса добавить ключ записи в карту.При повторном запросе id в следующий раз перейти к карте.Запрос, если запрос обнаружит, что ключ уже существует, он вернется напрямую.
Для распределенных, поскольку системы развернуты на разных машинах, вышеуказанные методы не могут быть использованы для решения этой проблемы, но эту проблему необходимо учитывать, иначе в будущем это приведет ко многим проблемам, таким как колебания сети, отсутствие защиты от встряски. на внешнем интерфейсе и т. д. Это приведет к повторному запросу интерфейса.
Например, в приведенном выше примере развернуты три машины, и на каждой машине развернут экземпляр системы А. Когда пользователь инициирует запрос на стороне клиента, поскольку сеть заблокирована, несмотря на то, что запрос был получен в фоновом режиме, клиентский интерфейс не может вернуть запрос. В это время пользователь снова инициирует запрос. Отправьте запрос, что приведет к еще одному запросу на отправку и, если его не контролировать, будет сгенерировано несколько сведений о заказе.
Брат Хуа также столкнулся с ситуацией, когда идемпотентность может возникнуть раньше.Друзья платежа WeChat должны понимать, что когда мы вызываем унифицированный платеж WeChat и завершаем платеж, платформа WeChat сделает обратный вызов.В это время будет ситуация, если мы получить обратный вызов WeChat, но не вернуться в WeChat, платформа WeChat будет продолжать возвращаться к бизнес-платформе.В это время мы должны обеспечить идемпотентность интерфейса.
Как обеспечить идемпотентность?
В распределенной системе идемпотентность может быть гарантирована тремя способами:
- Добавляйте к каждому запросу уникальный идентификатор, например, при оплате заказа добавьте id заказа, а один и тот же id заказа может быть обработан только один раз;
- Добавляйте записи в базу данных, например, изменяйте статус заказа или добавляйте серийный номер записи после обратных вызовов WeChat, чтобы при каждом обратном вызове WeChat интерфейс сначала проверял базу данных и возвращал данные напрямую, если есть существующие записи;
- Добавляем промежуточное ПО redis.По сути это аналогично карте в автономной системе.После обработки каждого запроса мы записываем уникальный id запроса в redis.В следующий раз запрос запрашивается снова,т.к.redis уже имеет ключ записи, он больше не будет обрабатываться.
напиши в конце
Сегодня я поделился с вами некоторыми распространенными решениями для обеспечения распределенной идемпотентности.Конечно, есть много других способов выбрать подходящее решение в соответствии с конкретными бизнес-сценариями.