Оригинальный адрес:Расскажите об идемпотентности в развитии
Idempotent (Idempottence) концепция
Идемпотентные математические концепции
Идемпотентность выводится из математической концепции. Есть два основных определения
Если в унарной операции x является любым числом в наборе, и если выполняется f(x) = f(f(x)) , то операция f является идемпотентной, например, операция абсолютного значения abs(a) = abs ( abs(a)) — идемпотентная функция.
Если в бинарной операции x является любым числом в наборе, если выполняется f(x,x) = x и предпосылка состоит в том, что два параметра операции f равны x, то мы говорим, что операция f является также идемпотентный, например Поиск функции с большими значениями max(x,x) = x является идемпотентной функцией.
Концепция идемпотентности в развитии
Понятие идемпотентности в математике может быть абстрактным, но идемпотентность чрезвычайно важна в развитии. Проще говоря,Для одной и той же системы в тех же условиях запрос ресурсов и влияние на повторные запросы одинаковы, говорится, что операция идемпотентна.. Например, если интерфейс является идемпотентным, при передаче одного и того же условия его эффект должен быть таким же.
Особенно, когда интерфейсы RPC или Restful в распределенной системе вызывают друг друга, легко вызвать исключение во время вызова из-за различных причин, таких как сетевые ошибки и необходимость повторной попытки.В это время должна быть гарантирована идемпотентность интерфейса. .В противном случае результат повторной попытки будет отличаться от результата первого вызова.Если имеется интерфейсная цепочка вызовов A->B->C->D->E, то после аварийной повторной попытки в D-> Шаг E Возврат неверного результата также повлияет на A, B, C, что может иметь катастрофические последствия.
Некоторые распространенные примеры необходимости идемпотентности в жизни:
- Один и тот же пользователь в системе блогов лайкает одну и ту же статью, даже если человек 30 лет не женат и лайкает как сумасшедший, он может поставить этой статье только +1 лайк.
- При оплате через WeChat заказ должен быть вычтен только один раз, поэтому, будь то проблема с сетью или ошибка и т. д., повторная оплата должна быть вычтена только один раз.
Равенство мощности и параллельная безопасность
В доступе к сети к информации я вижу много статей и вопросов безопасности, такие как мощность и некоторые смущенные. Idempottence Внешние интерфейсы - это приверженность системе, а не реализацию, результаты обещают много раз одинаковую операцию будет одинаково. Вопросы безопасности и параллелизма, когда несколько потоков одновременно для той же операции ресурса, из-за последовательности операций в результате неверных результатов.
На самом деле это два совершенно разных вопроса, например, даже если вы продолжаете отправлять платеж за один и тот же заказ, если деньги списываются несколько раз, это означает, что операция не является идемпотентной. Однако, если несколько заказов оплачиваются одновременно, а окончательная сумма вычета не является суммой нескольких сумм, это означает, что в этой операции существует параллельная проблема безопасности. Следовательно, идемпотентность и безопасность параллелизма — совершенно двумерные вопросы, которые следует обсуждать и решать отдельно.
Решения, которые я видел в некоторых статьях, посвященных идемпотентности, — это «пессимистическая блокировка» и «оптимистическая блокировка». Эти два решения могут хорошо решать проблемы параллелизма, но они не должны быть идемпотентными проблемами. Решения, особенно пессимистические блокировки, используются для предотвращения множественных блокировок. потоки от изменения ресурса одновременно. Напротив, механизм оптимистической блокировки с номером версии едва ли можетtoken
или状态标识
как номер версии для достижения идемпотентности (поясняется нижеtoken
и状态标识
), едва сказал в прошлом.
Следовательно, идемпотентность и безопасность параллелизма различны.В этой статье обсуждается только вопрос идемпотентности, а вопрос безопасности параллелизма не обсуждается.
Протокол HTTP и идемпотентность
Если операции классифицировать по функциям, то выделяют четыре типа добавления, удаления, изменения и поиска, которые в протоколе http представлены как Get, Post, Put и Delete.
Операция запроса (получить)
Метод Get используется для получения ресурсов и не должен изменять системные ресурсы, поэтому он является идемпотентным.Обратите внимание, что упоминание об идемпотенте здесь относится к изменениям в системных ресурсах, а не к результату возврата данных.Даже если возвращаемый результат отличается, сама операция не имеет побочных эффектов, поэтому она идемпотентна.
Удалить операцию (удалить)
Метод Delete используется для удаления ресурсов, хотя изменение системных ресурсов,Но первая и N-я операции удаления одинаково влияют на систему., поэтому он идемпотент. Например, если вы хотите удалить ресурс с id 1234, он может быть удален при первом вызове, а при всех последующих обращениях ресурса с этим id в системе нет, но эффект первая операция и последующие операции в системе одинаковы, поэтому это также идемпотент, и вызывающий объект может вызывать этот интерфейс несколько раз, не беспокоясь об ошибках.
Изменить действие (поместить)
Операции модификации могут быть идемпотентными, а могут и не быть. Если измененный ресурс зафиксирован, например, изменив сумму на счете на 1000 юаней, он идемпотент, сколько бы раз его не вызывали. Если ресурс не фиксированный, например, сумма на счету уменьшена на 50 юаней, то результат однократного и многократного вызова однозначно будет разным, в это время он не является идемпотентным. Желание идемпотентности в операциях модификации обсуждается ниже.
2019-08-13 Изменено
В исходном тексте есть ошибка в определении протокола Put.Операция Put должна быть идемпотентной, то есть, если она объявлена как протокол Put, это эквивалентно объявлению интерфейса идемпотентным. Итак, для исходного примера
账户中金额减少50元
Такого рода операции не разрешены в протоколе Put, вы можете сделать только что-то вроде账户中金额改为 1000 元
операцияСсылаться на:restful-api.net/idempotent-…
Добавить операцию (Пост)
Новая работа поста не является операцией IDEMPotent по своей природе, и его определение в протоколе HTTP заключается в следующем:
The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line.
В его определении говорится, что запросы Post используются для создания новых ресурсов, а это означает, что каждый вызов будет генерировать новые ресурсы в системе, поэтому эта операция не предназначена для того, чтобы быть идемпотентной операцией. В настоящее время, если вы хотите быть идемпотентом, вы должны внедрить его в бизнес.Решение будет рассмотрено ниже.
Схема достижения идемпотентности
Упомянутая выше идемпотентность все еще является относительно теоретической, и схема идемпотентного проектирования обсуждается ниже в сочетании с некоторыми распространенными практическими бизнес-сценариями.
таблица дедупликации
Используя характеристики базы данных для достижения мощности и т. Д. Обычно он построен на таблице, чтобы построить уникальный индекс, затем до тех пор, пока данные завершены, остальные также не могут успешно писать.
Общая бизнес-система блог недурно функция, пользователь после того, как Боуэн палец вверх, поместите идентификатор пользователя и привязки идентификатора Боуэна, следуйте точкам пользователя, Боуэн не может согласиться вставить. Или в финансовой системе, чтобы пользователь создал финансовую учетную запись, пользователь, безусловно, не может иметь более одной учетной записи, вы добавляете уникальный индекс для хранения идентификатора пользователя в таблице учетных записей, поэтому, даже если повторный пользователь может иметь только одну учетную запись .
Идентификатор статуса
Идентификация состояния является очень распространенным методом проектирования идемпотентов.Основная идея состоит в том, чтобы гарантировать, что каждый процесс в бизнесе может быть выполнен только в соответствующем состоянии путем изменения идентификации состояния.Если идентификация перешла в следующее состояние, операция предыдущего состояния не может изменить состояние , что обеспечивает бизнес-идемпотентность.
Идентификаторы состояния часто используются в сценариях с длительными бизнес-процессами и большим количеством данных, которые необходимо изменить. Самый классический пример — система заказов, если заказ должен пройти четыре шага: создание заказа -> оплата\отмена заказа -> расчет счета -> уведомление мерчанта. Затем можно вычесть соответствующий баланс со счета после завершения оплаты заказа и использовать соответствующий купон. Однако из-за сетевых и других причин возвращается сообщение об ошибке. В это время он попытается снова выполнить шаг расчета учетной записи, что приведет к ошибке данных.
Следовательно, чтобы обеспечить идемпотентность всего процесса заказа, к информации о заказе можно добавить индикатор состояния, а соответствующий индикатор состояния можно изменить после завершения шага. Например, после успешной оплаты заказа метка заказа меняется на успешную оплату.Теперь при повторном вызове интерфейса оплаты или отмены заказа сначала будет оцениваться метка статуса заказа.Если заказ уже оплачен или заказ был отменен, он не будет оплачен снова.
Механизм токена
Механизм Token должен иметь широкий диапазон мощности, такой как широкий спектр приложений, и конкретная реализация также очень похожа.Но основная идея заключается в том, что каждая операция генерирует уникальный сертификат токена, и сервер использует этот уникальный сертификат, чтобы гарантировать, что одна и та же операция не будет выполняться дважды.. В дополнение к буквальной уникальной строке этот токен также может быть комбинацией нескольких флагов (например, упомянутого выше флага состояния) или даже идентификатора периода времени и так далее.
Например, размещение нового сообщения на форуме — типичная операция добавления сообщения. Вы можете позволить пользователю отправлять с уникальным токеном.Пока сервер считает, что токен существует, ему не разрешено отправлять, и может быть гарантирована идемпотентность.
Приведенный выше пример легче понять, но бизнес относительно прост. Поскольку механизм токенов широко применим, требования, которым следует уделить внимание при его разработке, также будут различаться в зависимости от бизнеса.
Когда и как генерируется токен? Это ядро механизма. Возьмем приведенную выше систему форума в качестве примера. Если вы создаете токен, когда пользователь отправляет сообщение, новый токен будет генерироваться каждый раз, когда пользователь нажимает кнопку «Отправить», и тогда отправка может быть успешной. , который не является идемпотентом. Токен должен быть сгенерирован до того, как пользователь отправит контент, например, при входе на страницу редактирования. Когда пользователь отправляет контент, контент отправляется вместе с токеном. Независимо от того, сколько раз пользователь отправляет одну и ту же страницу, он может быть успешным максимум один раз.Таким образом, возможность генерации токена должна быть гарантирована, что операция выполняется несколько раз с тем же эффектом, что и задание.. Использование механизма Token требует от разработчиков хорошего понимания бизнес-процессов.
Эпилог
Идемпотентность является очень распространенным и важным требованием в разработке. В частности, в таких отраслях, как финансы и платежи, к нему предъявляются более строгие требования, что требует как хорошей производительности, так и строгой идемпотентности. В дополнение к овладению его концепциями, понимание собственных бизнес-требований является ключом к реализации идемпотентных функций.Необходимо разобраться с деталями каждого узла.Если дизайн не идеален, конечный результат может все еще не соответствовать требованиям.