Что такое идемпотентная операция?
Что такое идемпотентная операция?
15 ответов:
в вычислениях идемпотентная операция-это операция, которая не имеет дополнительного эффекта, если она вызывается более одного раза с теми же входными параметрами. Например, удаление элемента из набора можно считать идемпотентной операцией на множестве.
в математике идемпотентная операция-это та, где f(f(x)) = f (x). Например,
abs()
функция является тождественной, так какabs(abs(x)) = abs(x)
для всехx
.это немного разные определения могут быть примиряется, учитывая, что x в математическом определении представляет состояние объекта, а f - это операция, которая может изменить этот объект. Например, рассмотрим!--19-->Python
set
иdiscard
метод. Элементdiscard
метод удаляет элемент из набора, и ничего не делает, если элемент не существует. Итак:my_set.discard(x)
имеет точно такой же эффект, как и выполнение той же операции дважды:
my_set.discard(x) my_set.discard(x)
идемпотентные операции часто используются при проектировании сетевых протоколов, где запрос на выполнение операции гарантированно произойдет по крайней мере один раз, но также может произойти и несколько раз. Если операция идемпотентна, то нет никакого вреда в выполнении операции в два или более раз.
смотрите статью Википедии на idempotence для получения дополнительной информации.
выше ответ ранее имел некоторые неверные и вводящие в заблуждение примеры. Комментарии ниже, написанные до апреля 2014 года, относятся к более старой редакции.
идемпотентная операция может быть повторена произвольное число раз и результат будет тот же, как если бы это было сделано только один раз. В арифметике добавление нуля к числу идемпотентно.
об идемпотентности много говорят в контексте" спокойных " веб-сервисов. REST стремится максимально использовать HTTP для предоставления программам доступа к веб-контенту и обычно устанавливается в отличие от веб-служб на основе SOAP, которые просто туннелируют службы стиля удаленного вызова процедур внутри HTTP запросы и ответы.
REST организует веб-приложение в "ресурсы" (например, пользователь Twitter или изображение Flickr), а затем использует HTTP-команды POST, PUT, GET и DELETE для создания, обновления, чтения и удаления этих ресурсов.
Idempotence играет важную роль в отдыхе. Если вы получаете представление ресурса REST (например, получаете изображение jpeg из Flickr), и операция завершается неудачно, вы можете просто повторить GET снова и снова, пока операция не завершится успешно. К веб-сервис, это не имеет значения, сколько раз изображение получено. Кроме того, если вы используете веб-службу RESTful для обновления информации о своей учетной записи Twitter, вы можете поместить новую информацию столько раз, сколько потребуется для получения подтверждения от веб-службы. Положить его тысячу раз-это то же самое, что положить его один раз. Точно так же удаление ресурса REST тысячу раз-это то же самое, что удаление его один раз. Таким образом, идемпотенция значительно упрощает создание веб-службы, которая является устойчивой к ошибкам связи.
читайте далее: RESTful Web Services, Ричардсон и Руби (идемпотенция обсуждается на стр. 103-104), и Рой Филдинг докторская диссертация по отдыху. Филдинг был одним из авторов HTTP 1.1, RFC-2616, который говорит об идемпотентности в 9.1.2.
идемпотентность означает, что применение операции один раз или применение ее несколько раз имеет тот же эффект.
примеры:
- умножение на ноль. Независимо от того, сколько раз вы это делаете, результат все равно равен нулю.
- установка логического флага. Независимо от того, сколько раз вы это делаете, флаг остается установленным.
- удаление строки из базы данных с указанным идентификатором. Если вы попробуете еще раз, строка все еще отсутствует.
на чистый функции (функции без побочных эффектов) тогда идемпотентность подразумевает, что f(x) = f(f(x)) = f(f(x)) = f(f(f(x)))=...... для всех значений x
на функции с побочными эффектами, идемпотентность кроме того подразумевает, что никакие дополнительные побочные эффекты не будут вызваны после первого применения. Вы можете считать состояние мира дополнительным "скрытым" параметром функции, если хотите.
обратите внимание, что в мире, где ты есть продолжая параллельные действия, вы можете обнаружить, что операции, которые вы считали идемпотентными, перестают быть таковыми (например, другой поток может отменить значение логического флага в приведенном выше примере). В основном, когда у вас есть параллелизм и изменяемое состояние, вам нужно гораздо более тщательно подумать об идемпотентности.
идемпотентность часто является полезным свойством при построении надежных систем. Например, если существует риск того, что вы можете получить дубликат сообщения от третьей стороны, это полезно, чтобы обработчик сообщений действовал как идемпотентная операция, так что эффект сообщения происходит только один раз.
идемпотентная операция дает результат в том же состоянии, даже если вы называете это несколько раз, вы в те же параметры.
просто хотел выбросить реальный прецедент, который демонстрирует идемпотентность. В JavaScript, скажем, вы определяете кучу классов моделей (как в модели MVC). Как это часто реализуется функционально эквивалентен примерно так (простой пример):
function model(name) { function Model() { this.name = name; } return Model; }
затем вы можете определить новые классы следующим образом:
var User = model('user'); var Article = model('article');
но если бы вы попытались получить
User
класса поmodel('user')
откуда-то еще в коде, это будет неудача:var User = model('user'); // ... then somewhere else in the code (in a different scope) var User = model('user');
эти два
User
конструкторы были бы другими. То есть,model('user') !== model('user');
сделать идемпотентных, вы бы просто добавить какой-то механизм кэширования, как это:
var collection = {}; function model(name) { if (collection[name]) return collection[name]; function Model() { this.name = name; } collection[name] = Model; return Model; }
добавляя кэширование, каждый раз, когда вы делали
model('user')
это будет тот же самый объект, и поэтому он идемпотентен. Итак:model('user') === model('user');
Идемпотентные Операции: операции, которые не имеют побочных эффектов при многократном выполнении.
пример: операция, которая извлекает значения из ресурса данных и, скажем, печатает его
Идемпотентными Операциями: операции, которые причинили бы некоторый вред, если бы выполнялись несколько раз. (Как они меняют некоторые значения или состояния)
пример: операция по снятию средств с банковского счета
идемпотентная операция над набором оставляет его члены неизменными при применении один или несколько раз.
Это может быть унарная операция типа absolute (x) где x принадлежит множеству положительных целых чисел. Здесь Абсолют(absolute (x)) = x.
Это может быть двоичная операция, как союз с самим собой. всегда будет возвращать один и тот же набор.
ура
идемпотентная операция-это операция, действие или запрос, которые могут быть применены несколько раз без изменения результата, т. е. состояния системы, за пределами первоначального приложения.
ПРИМЕРЫ (КОНТЕКСТ ВЕБ-ПРИЛОЖЕНИЯ):
NULLIPOTENT: Если операция не имеет побочных эффектов, таких как чисто отображение информации на веб-странице без каких-либо изменений в базе данных (другими словами, вы только читаете базу данных), мы говорим, что операция NULLIPOTENT. Все должно быть ничтожество. В противном случае используйте POST.
идемпотентный: Сообщение в системе обмена сообщениями электронной почты открывается и помечается как "открыто" в базе данных. Можно открыть сообщение много раз, но это повторное действие приведет только к тому, что сообщение будет находиться в состоянии "открыто". Это идемпотентная операция.
НЕИДЕМПОТЕНТНЫЙ: Если операция всегда вызывает изменение состояния, например повторное отправление одного и того же сообщения пользователю, в результате чего отправляется и сохраняется новое сообщение в базе данных каждый раз мы говорим, что операция НЕИДЕМПОТЕНТНА.
говоря о состоянии системы, мы, очевидно, игнорируем, надеюсь, безвредные и неизбежные эффекты, такие как регистрация и диагностика.
довольно подробные и технические ответы. Просто добавляя простое определение.
Idempotent = Re-runnable
например,
Create
сама по себе операция не гарантируется без ошибок при выполнении более одного раза. Но если есть операцияCreateOrUpdate
затем он указывает на повторную запускаемость (идемпотентность).
это любая операция, которая каждый N-й результат приведет к выходу, соответствующему значению 1-го результата. Например, абсолютное значение -1 1. Абсолютное значение абсолютное значение -1 1. Абсолютное значение абсолютное значение абсолютное значение -1 1. И так далее.
см. также: Когда будет действительно глупо использовать рекурсию?
идемпотентные методы
идемпотентный метод-это метод, который будет давать одинаковые результаты независимо от того, сколько раз он вызывается.
The
GET
метод является идемпотентным, так как несколько вызовов ресурса GET всегда будут возвращать один и тот же ответ.The
PUT
метод является идемпотентным, так как вызов метода PUT несколько раз обновит один и тот же ресурс и не изменит результат.The
POST
не является идемпотентным, и вызов метода POST несколько раз может есть разные результаты и приведет к созданию новых ресурсов.The
DELETE
является идемпотентным, потому что как только ресурс будет удален, он исчезнет и вызов метода несколько раз не изменит результат.
мой 5c: В интеграции и сети идемпотентность очень важна. Несколько примеров из реальной жизни: Представьте, мы доставляем данные в целевую систему. Данные доставляются последовательностью сообщений. 1. Что произойдет, если последовательность смешивается в канале? (Как всегда делают сетевые пакеты:)). Если целевая система является идемпотентной, результат не будет отличаться. Если целевая система зависит от правильного порядка в последовательности, мы должны реализовать resequencer на целевом сайте, который бы восстановить правильный порядок. 2. Что произойдет, если есть дубликаты сообщений? Если канал целевой системы не подтверждает своевременность, исходная система (или сам канал) обычно отправляет другую копию сообщения. В результате мы можем иметь дубликат сообщения на стороне целевой системы. Если целевая система является идемпотентной, она заботится о ней, и результат не будет отличаться. Если целевая система не является идемпотентной, мы должны реализовать deduplicator на целевой стороне системы канал.
короче, идемпотентные операции означает, что операция не приведет к различным результатам независимо от того, сколько раз вы работаете с идемпотентными операциями.
например, согласно определению спецификации HTTP,
GET, HEAD, PUT, and DELETE
являются идемпотентными операциями; однакоPOST and PATCH
нет. Вот почему иногда пост заменяется патчем.