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

726

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

Ваш Ответ

14   ответов
22

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

Error: User Rate Limit ExceededidempotentError: User Rate Limit Exceededdeterministic.
Error: User Rate Limit Exceededstackoverflow.com/questions/1077412/…
0

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

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

12

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

при применении один или несколько раз.

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

Это может быть двоичная операция типаunion of a set with itself всегда будет возвращать один и тот же набор.

ура

Error: User Rate Limit Exceeded
7

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

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

Error: User Rate Limit Exceeded
6

ение.

Idempotent = Re-runnable

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

Error: User Rate Limit Exceeded
8

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

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

NULLIPOTENT: Если операция не имеет побочных эффектов, например, просто отображает информацию на веб-странице без каких-либо изменений в базе данных (другими словами, вы только читаете базу данных), мы говорим, что операция НЕДОПУСТИМА. Все GET должны быть нулевыми. В противном случае используйте POST.

тождественный: Сообщение в системе обмена сообщениями электронной почты открывается и помечается как "открытое". в базе данных. Можно открыть сообщение много раз, но это повторное действие приведет только к тому, что это сообщение будет в «открытом» состоянии. государство. Это идемпотентная операция.

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

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

114

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

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

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

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

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

Error: User Rate Limit ExceededBenjamin PeirceError: User Rate Limit Exceeded
Error: User Rate Limit Exceededbut only oneError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededdon'tError: User Rate Limit Exceededsend a delete requestError: User Rate Limit Exceeded
Error: User Rate Limit ExceededSimilarly DELETE-ing a REST resource a thousand times is the same as deleting it onceError: User Rate Limit Exceeded
42

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

Примеры:

Multiplication by zero. No matter how many times you do it, the result is still zero. Setting a boolean flag. No matter how many times you do it, the flag stays set. Deleting a row from a database with a given ID. If you try it again, the row is still gone.

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

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

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

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

Error: User Rate Limit Exceededf(x) = f(f(x))Error: User Rate Limit Exceededf(x){return x+1;}Error: User Rate Limit Exceededf(x) != f(f(x)): f(1)Error: User Rate Limit Exceededf(2)Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededandError: User Rate Limit Exceededf(x) = f(f(x))Error: User Rate Limit ExceededxError: User Rate Limit ExceededfError: User Rate Limit ExceededfError: User Rate Limit Exceededx).
0

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

Error: User Rate Limit Exceeded
5

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

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

779

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

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

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

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

The above answer previously had some incorrect and misleading examples. Comments below written before April 2014 refer to an older revision.

Error: User Rate Limit ExceededDELETEError: User Rate Limit ExceededisError: User Rate Limit Exceeded
Error: User Rate Limit ExceededsetError: User Rate Limit Exceededdiscard.
Error: User Rate Limit ExceededdiscardError: User Rate Limit Exceededdiscard([my_set, x]) = [my_new_set, x]Error: User Rate Limit Exceededdiscard(discard([my_set, x]))Error: User Rate Limit Exceeded[my_new_set, x]Error: User Rate Limit Exceededjust oneError: User Rate Limit Exceeded
Error: User Rate Limit Exceededhas exactly the same effect as doing the same operation twiceError: User Rate Limit ExceededundefinedError: User Rate Limit Exceededthe same effectError: User Rate Limit ExceededundefinedError: User Rate Limit Exceeded
Error: User Rate Limit ExceededIdempotent operations are often used in the design of network protocolsError: User Rate Limit Exceeded
-2

retry-safe.

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
84

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededtruncateError: User Rate Limit Exceededdelete.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы