Вопрос

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

Это было полезно?

Решение

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

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

Эти несколько отличающиеся определения можно согласовать, приняв во внимание, что x в математическом определении представляет состояние объекта, и f это операция, которая может видоизменить этот объект.Например, рассмотрим Питон set и его discard способ.В discard метод удаляет элемент из набора и ничего не делает, если элемент не существует.Итак:

my_set.discard(x)

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

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

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

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


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

Другие советы

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

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

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

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

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

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

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

Примеры:

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

Для чистые функции (функции без побочных эффектов) тогда идемпотентность подразумевает, что f(x) = f(f(x)) = f(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');

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

ПРИМЕРЫ (КОНТЕКСТ веб-ПРИЛОЖЕНИЯ):

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

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

НУЛЛИПОТЕНТНЫЙ:Если операция не имеет побочных эффектов, таких как простое отображение информации на веб-странице без каких-либо изменений в базе данных (другими словами, вы только читаете базу данных), мы говорим, что операция является НУЛЕВОЙ.Все GETs должны быть нулевыми.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

повторная попытка безопасна.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top