Что такое идемпотентная операция?

Что такое идемпотентная операция?


person Will    schedule 03.07.2009    source источник
comment
Для любителей математики - f(f(x)) = f(x). Продолжайте читать ответы для более информативного содержания !!   -  person paradocslover    schedule 02.07.2021


Ответы (15)


В вычислениях идемпотентная операция - это операция, которая не имеет дополнительного эффекта, если она вызывается более одного раза с одними и теми же входными параметрами. Например, удаление элемента из набора можно рассматривать как идемпотентную операцию над набором.

В математике идемпотентная операция - это операция, где f (f (x)) = f (x). Например, функция abs() идемпотентна, потому что abs(abs(x)) = abs(x) для всех x.

Эти несколько разные определения можно согласовать, если учесть, что x в математическом определении представляет состояние объекта, а f - операция, которая может изменить этот объект. Например, рассмотрим Python set и его discard метод. Метод discard удаляет элемент из набора и ничего не делает, если элемент не существует. Так:

my_set.discard(x)

имеет тот же эффект, что и повторное выполнение одной и той же операции:

my_set.discard(x)
my_set.discard(x)

Идемпотентные операции часто используются при разработке сетевых протоколов, где запрос на выполнение операции гарантированно произойдет хотя бы один раз, но может также произойти более одного раза. Если операция идемпотентна, то нет ничего плохого в том, чтобы выполнить операцию два или более раз.

Дополнительную информацию см. В статье Википедии об идемпотенции.


В приведенном выше ответе ранее было несколько неверных и вводящих в заблуждение примеров. Комментарии ниже, написанные до апреля 2014 г., относятся к более ранней версии.

person Greg Hewgill    schedule 03.07.2009
comment
Пример: поскольку в ответе выше указано, что Idempotent operations are often used in the design of network protocols здесь связанный пример ** GET не предполагает изменения чего-либо на сервере, поэтому GET является идемпотентным. В контексте HTTP / сервлета это означает, что один и тот же запрос может быть выполнен дважды без каких-либо негативных последствий. ** POST НЕ идемпотентен. - person KNU; 01.04.2014
comment
Является ли безгражданство синонимом идемпотента? - person Michael Osofsky; 05.12.2014
comment
@MichaelOsofsky: Нет, в примере Python set в ответе установленный объект явно имеет состояние, а также предлагает некоторые идемпотентные операции, такие как discard. - person Greg Hewgill; 07.12.2014
comment
Замечательно, @GregHewgill, теперь я понимаю, что идемпотент и без состояния отличаются, потому что операция discard работает с состоянием, но возвращает тот же результат, если вызывается несколько раз с одними и теми же входными параметрами; discard просто выполняет другую работу, чтобы добиться этого результата. Спасибо за вашу помощь. - person Michael Osofsky; 08.12.2014
comment
@MichaelOsofsky, discard также можно реализовать без сохранения состояния, включив состояние в возвращаемое значение: discard([my_set, x]) = [my_new_set, x]. Итак, вы можете сделать discard(discard([my_set, x])). Обратите внимание, что [my_new_set, x] - это только один аргумент, а его тип - двухкортежный. - person Pacerier; 11.03.2015
comment
@mikera, состояние мира - это не дополнительный неявный аргумент, а единственный аргумент. Если бы у вас были дополнительные аргументы, операция была бы бинарной, и можно было считать идемпотентным, только если оба аргумента < б> идентичный. Чтобы оставаться унарной идемпотентной операцией, состояние мира должно быть аргументом и возвращаемым значением. - person Pacerier; 11.03.2015
comment
Не удаление элемента из набора, а удаление данного числа из набора. Поскольку, например, вы делаете array.pop() операция определенно вредит набору каждый раз, когда она вызывается. - person Green; 10.10.2015
comment
Как вы можете сказать, что имеет тот же эффект, что и выполнение одной и той же операции дважды? Это точно не имеет такого же эффекта. Если я удаляю элемент из набора при первом вызове, и он успешно удаляется, во-первых, я получаю удаленный элемент (в JS, а не в python), во-вторых, состояние набора изменяется. Если я повторяю операцию, я получаю undefined и набор не изменяется. Итак, где же тот же эффект, о котором вы говорите? Совершенно разные. Но любые последующие вызовы действительно имеют тот же эффект: вы получаете undefined, а набор не изменяется. Я действительно не понимаю вычислительную идемпотентность. - person Green; 10.10.2015
comment
@Green Использование термина такой же эффект в контексте импотенции означает, что тот же результат, а не действие. Вызов discard(x) во второй раз будет иметь тот же эффект, что и вызов в первый раз: набор больше не будет содержать x. Вычислительная идемпотентность - это надежность системы. Поскольку что-то может выйти из строя (например, отключение сети), как вы его восстановите при обнаружении сбоя? Самый простой способ восстановления - это просто сделать это снова, но это сработает только в том случае, если повторное выполнение идемпотентно. Например. discard(x) идемпотентен, а pop() нет. Все дело в исправлении ошибок. - person Andreas; 27.04.2016
comment
Для тех, кто говорит по-русски, перейдите на ru.wikipedia.org/wiki/. Безусловно, самое четкое определение! - person Andrew Shatnyy; 04.08.2016
comment
весь смысл вопросов в другом месте состоит в том, что объяснения в Википедии о математических вещах обычно труднее переварить / понять, учитывая то, как это объясняется в Википедии. - person ahnbizcad; 10.08.2016
comment
@Andreas Как насчет второго примера в Википедии: предположим, что начальное значение переменная равна 3, и есть последовательность, которая читает переменную, затем изменяет ее на 5, а затем читает ее снова? Вы думаете, что это идемпотент? - person Franklin Yu; 20.12.2017
comment
@FranklinYu Я все еще думаю, что что является идемпотентным? Этот пример касается композиции идемпотентных методов, и нет композиции ни в этом вопросе, ни в этом ответе. Пример из Википедии кажется мне довольно ясным, и в нем конкретно говорится, что составной пример не идемпотентен, хотя каждый из трех методов / операций таковыми. Я не понимаю вашего вопроса. - person Andreas; 20.12.2017
comment
@Andreas Но в этом случае второй вызов не меняет состояния и возвращает другое значение, точно такой же случай в HTTP DELETE. Если это не идемпотент, то как DELETE идемпотент? - person Franklin Yu; 20.12.2017
comment
@FranklinYu Если вы находитесь в сценарии, в котором важна идемпотентность, то вы также знаете, что второй DELETE может вернуть 404 (не найдено), что означает, что независимо от того, получите ли вы 404 или 200 (или 202, или 204), вы знаете, что Получил то, что хотел. Итак, что касается вас, 404 - это действительный ответ, говорящий о том, что то, о чем вы просили, было сделано. Таким образом, метод является идемпотентным. В этом случае и 404, и 200 означают ОК. - person Andreas; 20.12.2017
comment
Будет ли функция, извлекающая ответ из базы данных, считаться идемпотентной? Если бы данные менялись между вызовами, результат был бы другим. Я думаю о случае, когда в запросе к базе данных есть функция «now ()» по сравнению с той, в которой вы передаете время в качестве параметра. Изменить: Да, об этом говорится в статье Википедии! - person Chris Huang-Leaver; 13.10.2020

Идемпотентная операция может повторяться произвольное количество раз, и результат будет таким же, как если бы она была выполнена только один раз. В арифметике добавление нуля к числу идемпотентно.

Об идемпотентности много говорят в контексте "RESTful" веб-сервисов. REST стремится максимально использовать HTTP для предоставления программам доступа к веб-контенту и обычно настраивается в отличие от веб-служб на основе SOAP, которые просто туннелируют службы стиля удаленного вызова процедур внутри HTTP-запросов и ответов.

REST организует веб-приложение в «ресурсы» (например, пользователя Twitter или изображение Flickr), а затем использует HTTP-команды POST, PUT, GET и DELETE для создания, обновления, чтения и удаления этих ресурсов.

Идемпотенция играет важную роль в REST. Если вы ПОЛУЧИТЕ представление ресурса REST (например, ПОЛУЧИТЕ изображение jpeg с Flickr), и операция завершится неудачно, вы можете просто повторять GET снова и снова, пока операция не завершится успешно. Для веб-службы не имеет значения, сколько раз изображение получено. Точно так же, если вы используете веб-службу RESTful для обновления информации своей учетной записи Twitter, вы можете ПОЛУЧИТЬ новую информацию столько раз, сколько потребуется, чтобы получить подтверждение от веб-службы. ПОСТАВИТЬ его тысячу раз - это то же самое, что ПОСТАВИТЬ его один раз. Точно так же УДАЛЕНИЕ ресурса REST тысячу раз равносильно его удалению один раз. Таким образом, идемпотентность значительно упрощает создание веб-службы, устойчивой к ошибкам связи.

Дополнительная литература: RESTful Web Services от Ричардсона и Руби (идемпотентность обсуждается на стр. 103-104) и докторская диссертация Роя Филдинга в REST. Филдинг был одним из авторов HTTP 1.1, RFC-2616, в котором говорится об идемпотентности в раздел 9.1.2.

person Jim Ferrans    schedule 03.07.2009
comment
Ясно и просто. Тем не менее, это , но только одна интерпретация идемпотента. - person Pacerier; 11.03.2015
comment
@Pacerier: Совершенно верно, у идемпотентности есть приложения во многих других областях, таких как функциональное программирование и обработка очереди сообщений. - person Jim Ferrans; 11.03.2015
comment
идемпотентность - это сильно перегруженное слово, потому что оно звучит высокопарно и имеет достаточно символов, чтобы пройти полуторную проверку. Если бы Бенджамин Пирс выбрал более простое слово, у нас даже не было бы этого вопроса сегодня. - person Pacerier; 11.03.2015
comment
Как это понимать: Точно так же УДАЛЕНИЕ ресурса REST тысячу раз - это то же самое, что удаление его один раз? Вы не можете удалить ресурс повторно, если он уже удален. - person Green; 10.10.2015
comment
@Green, но вы не удаляете его с первого раза. Вы отправляете запрос на удаление. Важным моментом является то, что вы можете отправлять столько запросов, сколько захотите. - person Caleth; 06.04.2017
comment
В руководствах REST указано, что ресурс следует обновлять с использованием PUT вместо POST, потому что PUT идемпотентен. если запрос PUT не выполняется, мы можем просто отправить его повторно, пока не получим успешный ответ от сервера. Что мешает мне повторно отправить неудавшийся POST запрос (обновление)? Что-то не так случится? - person mangusta; 15.02.2020
comment
Можно писать конечные точки POST, которые являются идемпотентными, и конечные точки PUT, которые не являются, @mangusta. Проблема заключается в соответствии определениям PUT и POST в спецификации HTTP. Чтобы правильно следовать HTTP, все ваши PUT должны быть идемпотентными. Но в спецификации ничего не говорится об идемпотентности POST. - person Jim Ferrans; 22.02.2020
comment
@JimFerrans Понятно. Я подумал, что может быть какая-то причина, связанная с функциональностью (встроенная в сам HTTP), почему PUT можно повторно отправлять без беспокойства, а POST - нет. Теперь кажется, что мы просто обязаны соответствовать стандартам HTTP, и поведение полностью зависит от того, как реализован сервер. - person mangusta; 22.02.2020

Сколько бы раз вы ни вызывали операцию, результат будет один и тот же.

person Robert    schedule 03.07.2009
comment
Я слышал, что идемпотент определяется как одно или оба из следующих: 1) Для заданного набора входных данных он всегда будет возвращать один и тот же результат. 2) Не вызывает побочных эффектов. У меня вопрос: если функция соответствует №1, но не №2, поскольку она приводит к побочному эффекту, не связанному с вычислением (например, регистрирует запрос в хранилище данных), считается ли она идемпотентной? - person Keith Bennett; 29.06.2012
comment
Результат вызова операции должен включать состояние системы, поэтому, если операция имеет кумулятивный побочный эффект, она не идемпотентна; однако, если побочный эффект оставляет систему в одном и том же состоянии независимо от того, сколько раз вызывается операция, он может быть идемпотентным. - person Robert; 18.07.2012
comment
Коротко и мило, мне нравятся такие ответы. Не уверен, почему я должен постоянно искать этот термин, он просто не остается со мной. - person Prancer; 02.02.2015
comment
@KeithBennett, второе определение неверное. Отсутствие побочного эффекта не означает идемпотентность. Идемпотентные функции могут иметь побочные эффекты. Например. MySQL truncate и delete. - person Pacerier; 11.03.2015
comment
Результат будет таким же (то есть состояние системы), но ответ может отличаться (например, коды состояния HTTP в службе REST). - person G. Steigert; 07.02.2018
comment
поэтому, если в базе данных есть счетчик строк, который используется для проверки целостности данных ввода запроса и состояния базы данных, нужно ли учитывать этот счетчик строк в определении идемпотента? этот счетчик строк будет увеличиваться для каждого запроса, но не будет возвращен как часть результата. - person swcraft; 27.04.2020

Идемпотентность означает, что однократное или многократное применение операции имеет одинаковый эффект.

Примеры:

  • Умножение на ноль. Сколько бы раз вы это ни делали, результат все равно нулевой.
  • Установка логического флага. Независимо от того, сколько раз вы это делаете, флаг остается установленным.
  • Удаление строки из базы данных с заданным идентификатором. Если вы попробуете еще раз, строка все равно исчезнет.

Для чистых функций (функций без побочных эффектов) идемпотентность означает, что f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (x)))) = ...... для всех значений x

Для функций с побочными эффектами идемпотентность, кроме того, означает, что после первого применения не будет никаких дополнительных побочных эффектов. Вы можете рассматривать состояние мира как дополнительный «скрытый» параметр функции, если хотите.

Обратите внимание, что в мире, где у вас происходят параллельные действия, вы можете обнаружить, что операции, которые вы считали идемпотентными, перестают быть таковыми (например, другой поток может сбросить значение логического флага в приведенном выше примере). Обычно, когда у вас есть параллелизм и изменяемое состояние, вам нужно гораздо более тщательно подумать об идемпотентности.

Идемпотентность часто бывает полезным свойством при построении надежных систем. Например, если существует риск того, что вы можете получить дубликат сообщения от третьей стороны, полезно, чтобы обработчик сообщения действовал как идемпотентная операция, чтобы эффект сообщения имел место только один раз.

person mikera    schedule 05.03.2012
comment
Если для чистых функций f(x) = f(f(x)), Вы имеете в виду, что f(x){return x+1;} не является чистой функцией? потому что f(x) != f(f(x)): f(1) дает 2, а f(2) дает 3. - person Pacerier; 11.03.2015
comment
@Pacerier Нет, @mikera говорит, что чистый и идемпотент подразумевает f(x) = f(f(x)). Но, как упомянул @GregHewgill, для того, чтобы это определение имело смысл, вы должны рассматривать x как объект, а f как операцию, которая изменяет состояние объекта (то есть: вывод f является измененным x). - person Justin J Stark; 17.10.2016

Идемпотентная операция дает результат в том же состоянии, даже если вы вызываете ее более одного раза, при условии, что вы передаете одни и те же параметры.

person Caleb Huitt - cjhuitt    schedule 03.07.2009

Просто хотел выбросить реальный вариант использования, демонстрирующий идемпотентность. Скажем, в 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');
person Lance Pollard    schedule 09.10.2013
comment
Этот ответ кажется неправильным. Идемпотентность - это вызов операции, которая, как вы ожидаете, изменит какое-либо состояние, учитывая входные параметры, которые, если вы затем вызовете их снова с теми же параметрами, не окажут дальнейшего влияния на состояние. Но в вашем примере, прежде чем даже использовать кеширование, если мы дважды вызываем модель ('user'), это уже идемпотент, нет изменения состояния, просто создание и возврат нового отдельного объекта вызывающему (не сохраняется). Вы описываете шаблон фабрики идентификации объектов, который гарантирует, что «один и тот же» объект будет возвращаться через вызовы, полезный, но не объясняющий идемпотентность. - person Ash; 02.07.2020

Хорошим примером понимания идемпотентной операции может быть запирание автомобиля дистанционным ключом.

log(Car.state) // unlocked

Remote.lock();
log(Car.state) // locked

Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked

lock - идемпотентная операция. Даже если каждый раз при запуске lock возникает какой-то побочный эффект, например мигание, автомобиль все равно находится в том же заблокированном состоянии, независимо от того, сколько раз вы запускаете операцию блокировки.

person IVN    schedule 18.09.2019

Идемпотентная операция - это операция, действие или запрос, которые могут применяться несколько раз без изменения результата, то есть состояния системы, за пределами исходного приложения.

ПРИМЕРЫ (КОНТЕКСТ ВЕБ-ПРИЛОЖЕНИЯ):

IDEMPOTENT: создание нескольких одинаковых запросов имеет тот же эффект, что и отправка одного запроса. Сообщение в системе обмена сообщениями электронной почты открывается и помечается как «открытое» в базе данных. Сообщение можно открывать много раз, но это повторяющееся действие приведет только к тому, что сообщение будет в состоянии «открыто». Это идемпотентная операция. В первый раз, когда один PUT выполняет обновление ресурса, используя информацию, которая не соответствует ресурсу (состоянию системы), состояние системы изменится по мере обновления ресурса. Если одно и то же обновление для ресурса выполняется повторно, то информация в обновлении будет соответствовать информации, уже находящейся в системе, при каждом PUT, и никаких изменений в состоянии системы не произойдет. Повторяющиеся PUT с одной и той же информацией являются идемпотентными: первый PUT может изменить состояние системы, последующие PUT - нет.

НЕИДЕМПОТЕНТНЫЙ: если операция всегда вызывает изменение состояния, например, отправка одного и того же сообщения пользователю снова и снова, в результате чего новое сообщение отправляется и сохраняется в базе данных каждый раз, мы говорим, что операция НЕ ИДЕМПОТЕНТНАЯ.

NULLIPOTENT: если операция не имеет побочных эффектов, таких как просто отображение информации на веб-странице без каких-либо изменений в базе данных (другими словами, вы только читаете базу данных), мы говорим, что операция NULLIPOTENT. Все GET должны быть недействительными.

Говоря о состоянии системы, мы, очевидно, игнорируем безобидные и неизбежные эффекты, такие как ведение журнала и диагностика.

person nmit026    schedule 03.08.2015

Достаточно подробные и технические ответы. Просто добавляю простое определение.

Идемпотент = возможность повторного запуска

Например, не гарантируется, что операция Create сама по себе будет выполняться без ошибок, если выполняется более одного раза. Но если есть операция CreateOrUpdate, то в ней указывается возможность повторного запуска (идемпотентность).

person Manish Basantani    schedule 13.08.2015
comment
Это обманчивое определение. возможность повторного запуска не гарантирует идемпотентности. Операцию можно запускать повторно, и при каждом запуске она может добавлять дополнительные эффекты к результату, чтобы он не был идемпотентным. - person Saeed Mohtasham; 16.04.2018

Идемпотентные операции: операции, которые не имеют побочных эффектов при многократном выполнении.
Пример: операция, которая извлекает значения из ресурса данных и, скажем, печатает их

Неидемпотентные операции: операции, которые причинят некоторый вред, если выполнить несколько раз. (Поскольку они меняют некоторые значения или состояния)
Пример: операция по снятию средств с банковского счета

person Mahmoud Abou-Eita    schedule 06.12.2012
comment
Собственно неправильный ответ! для идемпотентной операции говорить об отсутствии побочных эффектов неверно. для неидемпотентных операций утверждение о причинении некоторого вреда является запутанным ответом. - person Saeed Mohtasham; 16.04.2018

Идемпотентная операция над набором оставляет его члены неизменными при применении один или несколько раз.

Это может быть унарная операция, например absolute (x), где x принадлежит набору положительных целых чисел. Здесь absolute (absolute (x)) = x.

Это может быть бинарная операция, например, объединение набора с самим собой всегда будет возвращать один и тот же набор.

ваше здоровье

person Arnkrishn    schedule 03.07.2009
comment
Идемпотентная операция - это операция, в которой f (f (x)) = f (x). оставляет своих членов неизменными - неправильный ответ. - person Saeed Mohtasham; 16.04.2018

Короче говоря, идемпотентные операции означают, что операция не приведет к разным результатам независимо от того, сколько раз вы выполняете идемпотентные операции.

Например, согласно определению спецификации HTTP, GET, HEAD, PUT, and DELETE - это идемпотентные операции; однако POST and PATCH нет. Поэтому иногда POST заменяется на PUT.

person Marcus Thornton    schedule 25.03.2016

Мой 5c: В интеграции и создании сетей идемпотентность очень важна. Несколько примеров из реальной жизни: представьте, мы доставляем данные в целевую систему. Данные доставляются в виде последовательности сообщений. 1. Что произойдет, если последовательность микшируется в канале? (Как всегда в сетевых пакетах :)). Если целевая система идемпотентна, результат не будет отличаться. Если целевая система зависит от правильного порядка в последовательности, мы должны реализовать ресеквенсор на целевом сайте, который восстановит правильный порядок. 2. Что будет, если будут дубликаты сообщений? Если канал целевой системы не подтверждает своевременно, исходная система (или сам канал) обычно отправляет другую копию сообщения. В результате мы можем иметь дублирующееся сообщение на стороне целевой системы. Если целевая система идемпотентна, она позаботится об этом, и результат не будет отличаться. Если целевая система не идемпотентна, мы должны реализовать дедупликатор на стороне канала целевой системы.

person Leonid Ganeline    schedule 07.11.2013
comment
Идемпотентность отдельных запросов, отправленных изолированно от любых других запросов (или чего-либо еще, что меняет состояние системы), не то же самое, что запросы переупорядочения. HTTP-запрос PUT и HTTP-запрос DELETE должны быть по отдельности идемпотентными, но это не означает, что порядок вызова PUT и DELETE по одному и тому же URL-адресу не имеет значения, потому что запрос PUT может иметь побочные эффекты! - person Robin Green; 08.03.2016

с защитой от повторных попыток.

Обычно это самый простой способ понять его значение в информатике.

person teknopaul    schedule 06.04.2017
comment
Повторная попытка подразумевает что-то, что не удалось в первый или предыдущий раз. Не совсем то же самое. - person Lasse V. Karlsen; 06.04.2017
comment
Кто отредактировал мой вопрос и проголосовал против? Это не тот текст, который я разместил ?? - person teknopaul; 09.04.2017
comment
Вы можете проверить журнал изменений, щелкнув ссылку под своим ответом, в которой говорится, что редактировалось X часов назад или аналогично. - person Lasse V. Karlsen; 09.04.2017

person    schedule
comment
это емкий ответ даже по прошествии 10 лет. +1 - person snr; 23.06.2019