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

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

Ответ 1

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

В математике идемпотентной операцией является функция, где 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 года, относятся к более ранней версии.

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Примеры:

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

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

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

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

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

Ответ 5

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

Ответ 6

Просто хотел выбросить реальный прецедент, демонстрирующий идемпотентность. В 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');

Ответ 7

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

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

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

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

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

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

Ответ 8

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

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

Ответ 9

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

Idempotent = Re-runnable

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

Ответ 10

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

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

Ответ 11

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

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

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

веселит

Ответ 12

Идемпотентные методы

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

  • Метод GET является idempotent, поскольку множественные вызовы ресурса GET всегда возвращают тот же ответ.

  • Метод PUT является idempotent, так как вызов метода PUT несколько раз обновляет тот же ресурс и не изменяет результат.

  • POST не является идемпотентным, а вызов метода POST несколько раз может имеют разные результаты и приведут к созданию новых ресурсов.

  • DELETE является idempotent, потому что как только ресурс будет удален, он исчезнет и вызов метода несколько раз не изменит результат.

Ответ 13

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

Ответ 14

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

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

Ответ 15

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

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

POST, с другой стороны, является типом запроса использовать для отправки транзакции по кредитной карте, добавить альбом в в корзину или изменить пароль. Запрос POST обычно изменяются на сервере и повторяют запрос может вызвать нежелательные эффекты (например, двойной биллинг). Многие браузеры помогают пользователю избежать повторения запрос POST.

Веб-приложения обычно используют запросы GET для чтения и POST-запросы для записи (которые обычно включают обновления, создает и удаляет). В запросе на оплату музыки используется POST. Запрос на поиск музыки, сценарий, который вы смотрите в следующий раз, использует GET.

Ответ 16

Я читал другие ответы, и кажется, что есть некоторая путаница в отношении идемпотенции. Я думаю, что это происходит, потому что иногда похоже, что его использование в программировании отличается от его математического определения (например, его использование для глаголов REST).

Если это вас смущает, посмотрите на эту статью, которая упростит https://mortoray.com/2014/09/05/what-is-an-idempotent-function/. Это объясняет, что мы всегда можем переписать случаи идемпотенции из программирования, чтобы следовать его математическому определению.

Ответ 17

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

log(Car.state) // unlocked

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

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

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

Ответ 18

повторить безопасный.

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