Что такое идемпотентная операция?
Что такое идемпотентная операция?
Ответы (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 г., относятся к более ранней версии.
Idempotent operations are often used in the design of network protocols
здесь связанный пример ** GET не предполагает изменения чего-либо на сервере, поэтому GET является идемпотентным. В контексте HTTP / сервлета это означает, что один и тот же запрос может быть выполнен дважды без каких-либо негативных последствий. ** POST НЕ идемпотентен.
- person KNU; 01.04.2014
set
в ответе установленный объект явно имеет состояние, а также предлагает некоторые идемпотентные операции, такие как discard
.
- person Greg Hewgill; 07.12.2014
discard
работает с состоянием, но возвращает тот же результат, если вызывается несколько раз с одними и теми же входными параметрами; discard
просто выполняет другую работу, чтобы добиться этого результата. Спасибо за вашу помощь.
- person Michael Osofsky; 08.12.2014
discard
также можно реализовать без сохранения состояния, включив состояние в возвращаемое значение: discard([my_set, x]) = [my_new_set, x]
. Итак, вы можете сделать discard(discard([my_set, x]))
. Обратите внимание, что [my_new_set, x]
- это только один аргумент, а его тип - двухкортежный.
- person Pacerier; 11.03.2015
array.pop()
операция определенно вредит набору каждый раз, когда она вызывается.
- person Green; 10.10.2015
undefined
и набор не изменяется. Итак, где же тот же эффект, о котором вы говорите? Совершенно разные. Но любые последующие вызовы действительно имеют тот же эффект: вы получаете undefined
, а набор не изменяется. Я действительно не понимаю вычислительную идемпотентность.
- person Green; 10.10.2015
discard(x)
во второй раз будет иметь тот же эффект, что и вызов в первый раз: набор больше не будет содержать x
. Вычислительная идемпотентность - это надежность системы. Поскольку что-то может выйти из строя (например, отключение сети), как вы его восстановите при обнаружении сбоя? Самый простой способ восстановления - это просто сделать это снова, но это сработает только в том случае, если повторное выполнение идемпотентно. Например. discard(x)
идемпотентен, а pop()
нет. Все дело в исправлении ошибок.
- person Andreas; 27.04.2016
DELETE
. Если это не идемпотент, то как DELETE
идемпотент?
- person Franklin Yu; 20.12.2017
DELETE
может вернуть 404 (не найдено), что означает, что независимо от того, получите ли вы 404 или 200 (или 202, или 204), вы знаете, что Получил то, что хотел. Итак, что касается вас, 404 - это действительный ответ, говорящий о том, что то, о чем вы просили, было сделано. Таким образом, метод является идемпотентным. В этом случае и 404, и 200 означают ОК.
- person Andreas; 20.12.2017
Идемпотентная операция может повторяться произвольное количество раз, и результат будет таким же, как если бы она была выполнена только один раз. В арифметике добавление нуля к числу идемпотентно.
Об идемпотентности много говорят в контексте "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.
PUT
вместо POST
, потому что PUT
идемпотентен. если запрос PUT
не выполняется, мы можем просто отправить его повторно, пока не получим успешный ответ от сервера. Что мешает мне повторно отправить неудавшийся POST
запрос (обновление)? Что-то не так случится?
- person mangusta; 15.02.2020
Сколько бы раз вы ни вызывали операцию, результат будет один и тот же.
truncate
и delete
.
- person Pacerier; 11.03.2015
Идемпотентность означает, что однократное или многократное применение операции имеет одинаковый эффект.
Примеры:
- Умножение на ноль. Сколько бы раз вы это ни делали, результат все равно нулевой.
- Установка логического флага. Независимо от того, сколько раз вы это делаете, флаг остается установленным.
- Удаление строки из базы данных с заданным идентификатором. Если вы попробуете еще раз, строка все равно исчезнет.
Для чистых функций (функций без побочных эффектов) идемпотентность означает, что f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (x)))) = ...... для всех значений x
Для функций с побочными эффектами идемпотентность, кроме того, означает, что после первого применения не будет никаких дополнительных побочных эффектов. Вы можете рассматривать состояние мира как дополнительный «скрытый» параметр функции, если хотите.
Обратите внимание, что в мире, где у вас происходят параллельные действия, вы можете обнаружить, что операции, которые вы считали идемпотентными, перестают быть таковыми (например, другой поток может сбросить значение логического флага в приведенном выше примере). Обычно, когда у вас есть параллелизм и изменяемое состояние, вам нужно гораздо более тщательно подумать об идемпотентности.
Идемпотентность часто бывает полезным свойством при построении надежных систем. Например, если существует риск того, что вы можете получить дубликат сообщения от третьей стороны, полезно, чтобы обработчик сообщения действовал как идемпотентная операция, чтобы эффект сообщения имел место только один раз.
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
f(x) = f(f(x))
. Но, как упомянул @GregHewgill, для того, чтобы это определение имело смысл, вы должны рассматривать x
как объект, а f
как операцию, которая изменяет состояние объекта (то есть: вывод f
является измененным x
).
- person Justin J Stark; 17.10.2016
Идемпотентная операция дает результат в том же состоянии, даже если вы вызываете ее более одного раза, при условии, что вы передаете одни и те же параметры.
Просто хотел выбросить реальный вариант использования, демонстрирующий идемпотентность. Скажем, в 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');
Хорошим примером понимания идемпотентной операции может быть запирание автомобиля дистанционным ключом.
log(Car.state) // unlocked
Remote.lock();
log(Car.state) // locked
Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked
lock
- идемпотентная операция. Даже если каждый раз при запуске lock
возникает какой-то побочный эффект, например мигание, автомобиль все равно находится в том же заблокированном состоянии, независимо от того, сколько раз вы запускаете операцию блокировки.
Идемпотентная операция - это операция, действие или запрос, которые могут применяться несколько раз без изменения результата, то есть состояния системы, за пределами исходного приложения.
ПРИМЕРЫ (КОНТЕКСТ ВЕБ-ПРИЛОЖЕНИЯ):
IDEMPOTENT: создание нескольких одинаковых запросов имеет тот же эффект, что и отправка одного запроса. Сообщение в системе обмена сообщениями электронной почты открывается и помечается как «открытое» в базе данных. Сообщение можно открывать много раз, но это повторяющееся действие приведет только к тому, что сообщение будет в состоянии «открыто». Это идемпотентная операция. В первый раз, когда один PUT выполняет обновление ресурса, используя информацию, которая не соответствует ресурсу (состоянию системы), состояние системы изменится по мере обновления ресурса. Если одно и то же обновление для ресурса выполняется повторно, то информация в обновлении будет соответствовать информации, уже находящейся в системе, при каждом PUT, и никаких изменений в состоянии системы не произойдет. Повторяющиеся PUT с одной и той же информацией являются идемпотентными: первый PUT может изменить состояние системы, последующие PUT - нет.
НЕИДЕМПОТЕНТНЫЙ: если операция всегда вызывает изменение состояния, например, отправка одного и того же сообщения пользователю снова и снова, в результате чего новое сообщение отправляется и сохраняется в базе данных каждый раз, мы говорим, что операция НЕ ИДЕМПОТЕНТНАЯ.
NULLIPOTENT: если операция не имеет побочных эффектов, таких как просто отображение информации на веб-странице без каких-либо изменений в базе данных (другими словами, вы только читаете базу данных), мы говорим, что операция NULLIPOTENT. Все GET должны быть недействительными.
Говоря о состоянии системы, мы, очевидно, игнорируем безобидные и неизбежные эффекты, такие как ведение журнала и диагностика.
Достаточно подробные и технические ответы. Просто добавляю простое определение.
Идемпотент = возможность повторного запуска
Например, не гарантируется, что операция Create
сама по себе будет выполняться без ошибок, если выполняется более одного раза. Но если есть операция CreateOrUpdate
, то в ней указывается возможность повторного запуска (идемпотентность).
Идемпотентные операции: операции, которые не имеют побочных эффектов при многократном выполнении.
Пример: операция, которая извлекает значения из ресурса данных и, скажем, печатает их
Неидемпотентные операции: операции, которые причинят некоторый вред, если выполнить несколько раз. (Поскольку они меняют некоторые значения или состояния)
Пример: операция по снятию средств с банковского счета
Идемпотентная операция над набором оставляет его члены неизменными при применении один или несколько раз.
Это может быть унарная операция, например absolute (x), где x принадлежит набору положительных целых чисел. Здесь absolute (absolute (x)) = x.
Это может быть бинарная операция, например, объединение набора с самим собой всегда будет возвращать один и тот же набор.
ваше здоровье
Короче говоря, идемпотентные операции означают, что операция не приведет к разным результатам независимо от того, сколько раз вы выполняете идемпотентные операции.
Например, согласно определению спецификации HTTP, GET, HEAD, PUT, and DELETE
- это идемпотентные операции; однако POST and PATCH
нет. Поэтому иногда POST
заменяется на PUT
.
Мой 5c: В интеграции и создании сетей идемпотентность очень важна. Несколько примеров из реальной жизни: представьте, мы доставляем данные в целевую систему. Данные доставляются в виде последовательности сообщений. 1. Что произойдет, если последовательность микшируется в канале? (Как всегда в сетевых пакетах :)). Если целевая система идемпотентна, результат не будет отличаться. Если целевая система зависит от правильного порядка в последовательности, мы должны реализовать ресеквенсор на целевом сайте, который восстановит правильный порядок. 2. Что будет, если будут дубликаты сообщений? Если канал целевой системы не подтверждает своевременно, исходная система (или сам канал) обычно отправляет другую копию сообщения. В результате мы можем иметь дублирующееся сообщение на стороне целевой системы. Если целевая система идемпотентна, она позаботится об этом, и результат не будет отличаться. Если целевая система не идемпотентна, мы должны реализовать дедупликатор на стороне канала целевой системы.
с защитой от повторных попыток.
Обычно это самый простой способ понять его значение в информатике.
f(f(x)) = f(x)
. Продолжайте читать ответы для более информативного содержания !! - person paradocslover   schedule 02.07.2021