it-roy-ru.com

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

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

763
Will

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

В математике идемпотентная операция - это операция, в которой 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)

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

См. Статью в Википедии о idempotence для получения дополнительной информации.


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

820
Greg Hewgill

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

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

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

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

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

122
Jim Ferrans

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

90
Robert

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

Примеры:

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

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

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

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

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

44
mikera

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

23
Caleb Huitt - cjhuitt

Просто хотел выбросить реальный случай использования, который демонстрирует идемпотентность. Скажем, в 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');

Чтобы сделать это idempotent, вы просто добавили бы некоторый механизм кэширования, например так:

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');
14
Lance Pollard

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

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

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

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

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

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

9
nmit026

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

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

8
Mahmoud Abou-Eita

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

Идемпотент = перезапускаемый

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

8
Manish Basantani

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

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

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

ура

7
Arnkrishn

Любая операция заключается в том, что каждый n-й результат приведет к выводу, совпадающему со значением 1-го результата. Например, абсолютное значение -1 равно 1. Абсолютное значение абсолютного значения -1 равно 1. Абсолютное значение абсолютного значения абсолютного значения -1 равно 1. И так далее.

Читайте также: Когда было бы действительно глупо использовать рекурсию?

6
Oorang

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

1
Leonid Ganeline

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

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

1
Marcus Thornton