предисловие
В бизнес-дизайне защита от дублирования является ключевым моментом.В качестве примера при проектировании интерфейса защита от дублирования предназначена для предотвращения многократного вызова интерфейса и создания грязных данных, таких как повторные платежи по платежным поручениям. дублирование очень важно Как предотвратить Прежде чем возобновить, давайте сначала посмотрим, как происходят повторяющиеся запросы.
когда происходит несколько вызовов
Существуют субъективные причины появления множественных обращений к интерфейсу, такие как атаки с искусственным повторным запросом, неправильная работа пользователя и т. д., а также объективные причины, такие как тайм-аут повторной попытки для надежности;
- атака с повторным запросом
Для такого рода злонамеренной атаки, по сути, она уже относится к категории безопасности, мы можем бороться с ней через черный список + текущий лимит, а затем рассмотреть обработку антирепликации на следующем шаге;
- Злоупотребление пользователем
Например, пользователь нажимает кнопку "Отправить" в интерфейсе, а пользователь нажимает "Отправить" несколько раз из-за ошибки руки. В этом случае клиент может выполнить некоторую обработку, чтобы уменьшить ошибки пользователя, например, после отправки кнопка становится серой. .Конечно, обработка антирепликации провайдера также необходима.
- тайм-аут повторной попытки
Чтобы обеспечить надежность системы, вызывающий интерфейс часто выполняет некоторую обработку повторных попыток.Например, различные RPC-фреймворки имеют для нас встроенные механизмы отказоустойчивости, и провайдер должен хорошо позаботиться о предотвращении весов;
Как хорошо справиться с антирепликационной обработкой, на самом деле ядром является обеспечение того, чтобы несколько одинаковых запросов выполнялись только один раз, или чтобы эффект от нескольких вызовов и одного вызова был одинаковым, то есть мы часто говорим обеспечить идемпотентность;
Когда нужна защита от веса
В конечном счете, все операции — это добавления, удаления, изменения и запросы.На самом деле, нам действительно нужно сделать антирепликационную обработку, и что более важно, добавить и изменить, сами запросы и удаления выполняются один или несколько раз, и эффект тот же, с естественной идемпотентностью.Хотя говорят, что он имеет естественную идемпотентность, сам запрос и удаление также потребляют ресурсы.Если он может предотвратить повторное выполнение, он также может сэкономить ресурсы; Дополнения и модификации должны быть сделаны для предотвращения веса.Увеличение может быть взято за пример, а модификация может быть взята за пример обновления инвентаря.Если вес не будет должным образом предотвращен, последствия будут очень серьезными, давайте возьмем взгляд на конкретные меры по предотвращению веса;
Как предотвратить вес
Вышеупомянутое в основном для добавления и изменения необходимости хорошо выполнять противотяжелую обработку.Конечно, существуют разные противотяжелые меры для добавления и модификации, а также есть унифицированные методы, которые представлены отдельно ниже;
Единый противовес
- жетонный механизм
Серверу необходимо предоставить услугу механизма получения токена, чтобы каждый раз, когда клиент сначала запрашивает токен, сервер сохранял токен в redis, клиент приносил токен при отправке запроса, чтобы сервер мог получить токен напрямую перейдите к redis для удаления и оцените, успешно ли он выполнен, в соответствии с возвращаемым значением:
localhost:0>get token
"111"
localhost:0>del token
"1"
localhost:0>del token
"0"
Храните токены через Redis, чтобы он мог хорошо работать в распределенной среде;
- Анти-тяжелый ключ
Создайте зашифрованный текст md5 в соответствии с параметрами запроса, а затем используйте этот зашифрованный текст в качестве ключа для хранения в Redis.Вы можете использовать команду setnx, чтобы убедиться, что только один может быть успешно сохранен;
key = MD5.md5("param1="+param1+"¶m2="+param2...)
localhost:0>setnx key 1
"1"
localhost:0>setnx key 1
"0"
- Таблица антивеса
Можно использовать ограничение уникального индекса таблицы, а аналогичный ключ защиты от дублирования можно использовать в качестве уникального поля индекса. После нескольких запросов только одна вставка будет успешной. Чтобы предотвратить слишком много данных в таблице защиты от дублирования, можно запустить таймер для регулярной очистки;
Вышеупомянутые методы имеют мало общего с конкретным бизнесом и могут быть применены к большинству сценариев, а также через Redis или базу данных и атомарные операции, чтобы гарантировать, что они могут хорошо работать в распределенной среде;
Вставить антивес
- select+insert
Первая мысль о вставке данных — сначала проверить, существуют ли они, а затем вставить их, но, очевидно, есть две операции, которые не являются атомарными операциями и могут быть решены блокировками под одним узлом. Атомарность гарантируется, конечно, его также можно использовать в сочетании с другими методами, такими как следующий уникальный механизм первичного ключа;
- уникальный первичный ключ
На самом деле этот метод не использует напрямую самоинкрементный первичный ключ базы данных, а использует алгоритм распределенного идентификатора для его генерации, так что при вставке данных он может быть ограничен уникальным первичным ключом, чтобы гарантировать, что только один будет успешным. ;
- механизм отката
В некоторых компаниях на самом деле есть прямой процесс и обратный процесс. Например, при оплате заказа статус заказа оценивается при получении уведомления об успешном платеже, возвращенном банком. Если платеж был успешным, вы можете перейти напрямую к процессу возврата;
Обновление антивеса
- оптимистическая блокировка
Оптимистическая блокировка часто используется в сценариях обновления, как показано ниже по номерам версий:
update table_name
sale = sale + 1,
version = version + 1,
WHERE id = #{id}
AND version = #{version}
- оптимистическая блокировка конечного автомата
В бизнесе связанных заказов задействовано много автоматов состояний.Состояние находится в обращении, и следующее состояние может наступить только после предыдущего состояния.Например, общие заказы на покупки включают в себя: отправлено, но не оплачено, успешная оплата, ожидание доставки, доставка В товаре, квитанция была подписана и т. д., каждый статус требует предварительного статуса;
update table_name
set status = 下一个状态
where id = #{id}
and status = #{status}
Суммировать
Есть много способов предотвратить потерю веса. Нам часто приходится делать соответствующий выбор для нашего собственного бизнеса. Различные виды бизнеса, разные объемы бизнеса и разные уровни толерантности будут влиять на то, как мы предотвращаем вес; каждый метод не является независимым. часто необходимо интегрировать несколько способов.
Спасибо за внимание
Вы можете следить за публичной учетной записью WeChat "откатить код», прочитайте ее впервые, и статья постоянно обновляется; сосредоточьтесь на исходном коде Java, архитектуре, алгоритме и интервью.