Что такое идемпотентная операция?
Что такое идемпотентная операция?
21 ответ
В вычислениях идемпотентная операция - это операция, которая не имеет никакого дополнительного эффекта, если она вызывается более одного раза с одинаковыми входными параметрами. Например, удаление элемента из набора может рассматриваться как идемпотентная операция на множестве.
В математике идемпотентная операция - это операция, в которой 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)
Идемпотентные операции часто используются при разработке сетевых протоколов, где запрос на выполнение операции гарантированно будет выполнен по крайней мере один раз, но может также произойти более одного раза. Если операция идемпотентна, то выполнение операции два или более раз не повредит.
См. Статью Wikipedia об идемпотентности для получения дополнительной информации.
Приведенный выше ответ ранее содержал несколько неверных и вводящих в заблуждение примеров. Комментарии ниже, написанные до апреля 2014 года, относятся к более старой редакции.
Идемпотентная операция может повторяться произвольное количество раз, и результат будет таким же, как если бы это было сделано только один раз. В арифметике добавление нуля к числу идемпотентно.
Об идемпотентности много говорят в контексте веб-сервисов "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.
Независимо от того, сколько раз вы вызываете операцию, результат будет одинаковым.
Идемпотентность означает, что применение операции один раз или несколько раз имеет одинаковый эффект.
Примеры:
- Умножение на ноль. Независимо от того, сколько раз вы делаете это, результат все равно равен нулю.
- Установка логического флага. Независимо от того, сколько раз вы делаете это, флаг остается установленным.
- Удаление строки из базы данных с заданным идентификатором. Если вы попробуете это снова, ряд все еще ушел.
Для чистых функций (функций без побочных эффектов) из идемпотентности следует, что f(x) = f(f(x)) = f(f(f(x))) = f(f(f(f(x)))) = ...... для всех значений х
Для функций с побочными эффектами идемпотентность также подразумевает, что никаких дополнительных побочных эффектов не будет вызвано после первого применения. Вы можете считать состояние мира дополнительным "скрытым" параметром для функции, если хотите.
Обратите внимание, что в мире, где происходят параллельные действия, вы можете обнаружить, что операции, которые вы считали идемпотентными, перестают быть таковыми (например, другой поток может сбросить значение логического флага в приведенном выше примере). В основном, когда у вас есть параллелизм и изменчивое состояние, вы должны гораздо более тщательно обдумывать идемпотентность.
Идемпотентность часто является полезным свойством при построении надежных систем. Например, если есть риск, что вы можете получить дубликаты сообщения от третьей стороны, полезно, чтобы обработчик сообщений действовал как идемпотентная операция, чтобы эффект сообщения появлялся только один раз.
Хорошим примером понимания идемпотентной операции может быть запирание автомобиля дистанционным ключом.
log(Car.state) // unlocked
Remote.lock();
log(Car.state) // locked
Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked
lock
идемпотентная операция. Даже если каждый раз возникает побочный эффектlock
, как мигает, автомобиль все еще находится в том же заблокированном состоянии, независимо от того, сколько раз вы запускали операцию блокировки.
Идемпотентная операция выдает результат в одном и том же состоянии, даже если вы вызываете его более одного раза, при условии, что вы передаете одни и те же параметры.
Идемпотентная операция - это операция, действие или запрос, которые могут применяться несколько раз без изменения результата, то есть состояния системы, за пределами первоначального применения.
ПРИМЕРЫ (КОНТЕКСТ ВЕБ-ПРИЛОЖЕНИЯ):
NULLIPOTENT: Если операция не имеет побочных эффектов, таких как просто отображение информации на веб-странице без каких-либо изменений в базе данных (другими словами, вы только читаете базу данных), мы говорим, что операция NULLIPOTENT. Все GET должны быть нулевыми. В противном случае используйте POST.
IDEMPOTENT: сообщение в системе обмена сообщениями электронной почты открывается и помечается как "открытое" в базе данных. Можно открыть сообщение много раз, но это повторное действие приведет только к тому, что это сообщение будет в "открытом" состоянии. Это идемпотентная операция.
NON-IDEMPOTENT: если операция всегда вызывает изменение состояния, например, POST отправляет одно и то же сообщение пользователю снова и снова, в результате чего новое сообщение каждый раз отправляется и сохраняется в базе данных, мы говорим, что операция не является IDEMPOTENT.
Говоря о состоянии системы, мы, очевидно, игнорируем безнадежно безвредные и неизбежные эффекты, такие как регистрация и диагностика.
Просто хотел выбросить реальный случай использования, который демонстрирует идемпотентность. В 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');
Довольно подробный и технический ответ. Просто добавив простое определение.
Идемпотент = перезапускаемый
Например, Create
Сама по себе операция не гарантируется без ошибок, если выполняется более одного раза. Но если есть операция CreateOrUpdate
тогда это заявляет повторный запуск (Идемпотентность).
Идемпотентные операции: Операции, которые не имеют побочных эффектов, если выполняются несколько раз.
Пример: операция, которая извлекает значения из ресурса данных и, скажем, печатает его
Неидемпотентные операции: Операции, которые могут причинить некоторый вред, если их выполнить несколько раз. (Как они меняют некоторые значения или состояния)
Пример: операция, которая снимается с банковского счета
Любая операция заключается в том, что каждый n-й результат приведет к выводу, соответствующему значению 1-го результата. Например, абсолютное значение -1 равно 1. Абсолютное значение абсолютного значения -1 равно 1. Абсолютное значение абсолютного значения абсолютного значения -1 равно 1. И так далее.
Читайте также: Когда было бы действительно глупо использовать рекурсию?
Идемпотентная операция над множеством оставляет его члены неизменными при применении один или несколько раз.
Это может быть унарная операция, такая как absolute(x), где x принадлежит множеству натуральных чисел. Здесь absolute(absolute(x)) = x.
Это может быть бинарная операция, например объединение множества с самим собой всегда будет возвращать один и тот же набор.
ура
Короче говоря, операции Идемпотента означают, что операция не приведет к различным результатам, независимо от того, сколько раз вы выполняете операции Идемпотента.
Например, согласно определению спецификации HTTP, GET, HEAD, PUT, and DELETE
идемпотентные операции; тем не мение POST and PATCH
не. Вот почему иногда POST заменяется на PATCH.
Идемпотентные методы
Идемпотентный метод - это метод, который дает одинаковые результаты независимо от того, сколько раз он вызывается.
GET
метод идемпотентен, так как несколько вызовов ресурса GET всегда будут возвращать один и тот же ответ.PUT
метод идемпотентен, так как многократный вызов метода PUT обновит один и тот же ресурс и не изменит результат.POST
не является идемпотентом, и многократный вызов метода POST может иметь разные результаты и приведет к созданию новых ресурсов.DELETE
является идемпотентным, поскольку после удаления ресурса он исчезает, и многократный вызов метода не изменит результат.
Операция называется идемпотентной, если ее многократное выполнение эквивалентно однократному выполнению.
Например: установка громкости на 20. Независимо от того, сколько раз громкость телевизора установлена на 20, конечный результат будет равен 20 . Даже если процесс выполняет операцию 50/100 и более раз, в конце процесса объем будет равен 20.
Пример счетчика: увеличение объема на 1. Если процесс выполнит эту операцию 50 раз, в конце объем будет начальным объемом + 50 , а если процесс выполнит операцию 100 раз, в конце объем будет начальным объемом + 100 . Как вы можете ясно видеть, конечный результат зависит от того, сколько раз выполнялась операция. Следовательно, мы можем заключить, что эта операция НЕ является идемпотентной.
Я выделил конечный результат жирным шрифтом .
Если вы мыслите с точки зрения программирования, скажем, у меня есть операция, в которой функция принимает входные данные, а выходные данные устанавливаются обратно. Если в конце процесса (который выполняет эту операцию 50/100 раз или более) моя переменная содержит значение, которое она имела, когда операция выполнялась только ОДИН РАЗ, тогда операция является идемпотентной, иначе НЕ.
foo = <some random value here, let's say -2>
если f возвращает квадрат ввода, то операция НЕ является идемпотентной. Потому что в конце будет
(-2) raised to the power (number of times operation is executed)
если f возвращает абсолютное значение ввода, то операция является идемпотентной, потому что независимо от того, сколько раз операция выполняется, она будет
Здесь конечный результат определяется как конечное значение переменной
В математическом смысле идемпотентность имеет несколько иное значение:
здесь вывод
1. Основы идемпотентности
Математически функция называется идемпотентной, еслиf(f(x)) = f(x)
. Итак, если у нас есть функцияabsolute(x)
, который возвращает положительный аналог целого числаx
; тогда ДОЛЖНО быть правдой следующее:
absolute(absolute(x)) = absolute(x)
Если мы возьмем х как-100
Независимо от того, сколько раз мы повторим эту операцию, результат после первого выполнения и результат после первого выполнения будут абсолютно одинаковыми.
Так,
absolute(-100) = 100
AND
absolute(absolute(-100)) = absolute(100) = 100
=> absolute(absolute(x)) = absolute(x)
❗ Здесь важно отметить, что «результат» не обязательно означает данные, возвращаемые функцией. Он относится к данным, над которыми выполняется операция.
Поэтому, если вы возьмете функцию в объектно-ориентированном программировании, например, набор со значениями, и попытаетесь сделатьadd(2)
; РЕЗУЛЬТАТ, т.е. содержимое набора НЕ изменится. Независимо от того, сколько раз вы повторите эту операцию, результат всегда будет одинаковым, т.е.{1,2,4}
. Однако когда вы добавляете элемент, которого нет в наборе, то есть вы выполняетеadd(3)
набор становится (без учета порядка) . Но когда вы повторите операцию еще раз (даже 100 раз), результат (т.е. набор) продолжит содержать{1,2,4,3}
. Это не относится к списку, поскольку он может содержать дубликаты. И каждый раз, когда вы добавляете что-то в список, оно всегда будет добавлено.
Для упрощения,
Операция называется идемпотентной, если ее можно повторить несколько раз таким образом, что результат после первого выполнения и результат после n выполнений будут совершенно одинаковыми.
Вдобавок к этому, любая операция, которая не изменяет данные, является идемпотентной, поскольку она не оказывает никакого влияния на состояние данных.
2. Идемпотентность в REST Итак, запросите такие методы, какGET, HEAD, OPTIONS, TRACE..
(которые не меняют данные) являются идемпотентными (при условии, что они реализованы правильно). Для методов, предназначенных для изменения данных, их идемпотентность может варьироваться. Например:
- PUT & DELETE: Должны быть реализованы таким образом, чтобы они были идемпотентными.
- POST и PATCH: Идемпотентность не гарантирована. Они могут быть, а могут и не быть.
3. Почему ДОЛЖЕН быть идемпотентным?
Согласно RFC-7231 IETF,PUT
предназначен для замены состояния сервера. Итак, если у вас есть адрес, хранящийся на веб-сайте, запрос PUT должен содержать полный адрес. Кроме того, он должен заменить данные на сервере (или создать, если они еще не существуют). Итак, РЕЗУЛЬТАТ после первого выполнения запроса и результат после многократного выполнения одного и того же запроса совершенно одинаковы.
4. Почему
DELETE
ДОЛЖЕН быть идемпотентным?
Удаление предназначено для удаления ресурса на сервере. Таким образом, если вы удаляете свой адрес, тот же адрес не может быть удален снова (он не существует и больше ничего не удаляется). Итак, еще раз: РЕЗУЛЬТАТ после первого выполнения и РЕЗУЛЬТАТ после многократного выполнения одного и того же запроса совершенно одинаковы.
❗ Распространенное заблуждение в REST заключается в том, что если запрос получает один и тот же ответ при каждом выполнении, он идемпотентен. Это неверно. Результат всегда относится к данным на сервере (т. е. к данным, над которыми выполняется операция). Размышляя об идемпотентности в REST, подумайте о состоянии сервера.
В этом видео очень подробно объясняются эти концепции: https://www.youtube.com/watch?v=R7s2FVN4c9Q .
Мой 5с: в интеграции и в сети идемпотентность очень важна. Несколько примеров из реальной жизни: представьте, мы доставляем данные в целевую систему. Данные доставляются последовательностью сообщений. 1. Что произойдет, если последовательность будет смешана в канале? (Как сетевые пакеты всегда делают:)). Если целевая система идемпотентна, результат не будет отличаться. Если целевая система зависит от правильного порядка в последовательности, мы должны реализовать повторный секвенсор на целевом сайте, который восстановил бы правильный порядок. 2. Что произойдет, если появятся дубликаты сообщения? Если канал целевой системы не подтверждает своевременно, исходная система (или сам канал) обычно отправляет другую копию сообщения. В результате мы можем получить дублированное сообщение на стороне целевой системы. Если целевая система идемпотентна, она позаботится об этом, и результат не будет отличаться. Если целевая система не идемпотентна, мы должны реализовать дедупликатор на стороне целевой системы канала.
С точки зрения обслуживания RESTful, чтобы операция (или вызов службы) была идемпотентной, клиенты могут совершать один и тот же вызов несколько раз, производя один и тот же результат. Другими словами, выполнение нескольких идентичных запросов имеет тот же эффект, что и выполнение одного запроса. Обратите внимание, что хотя идемпотентные операции дают одинаковый результат на сервере (без побочных эффектов), сам ответ может не совпадать (например, состояние ресурса может меняться между запросами).
GET представляет собой идемпотентную операцию только для чтения. Вы можете отправлять GET-запрос на сервер повторно без каких-либо побочных эффектов, потому что GET не изменяет (или не должен) изменять состояние на сервере.
С другой стороны, POST - это тип запроса, который вы используете для отправки транзакции по кредитной карте, добавления альбома в корзину или изменения пароля. Запрос POST обычно изменяет состояние на сервере, и повторение запроса может привести к нежелательным последствиям (таким как двойной биллинг). Многие браузеры помогают пользователю избежать повторения запроса POST.
Веб-приложения обычно используют GET-запросы на чтение и POST-запросы на запись (которые обычно включают в себя обновления, создание и удаление). Запрос на оплату музыки использует POST. Запрос на поиск музыки, сценарий которого вы смотрите далее, использует GET.
Допустим, клиент делает запрос к службе «IstanceA», которая обрабатывает запрос, передает его в БД и выключается перед отправкой ответа. так как клиент не увидит, что он был обработан и повторит тот же запрос. Балансировщик нагрузки перенаправит запрос другому экземпляру службы, «InstanceB», который внесет те же изменения в тот же элемент БД.
Мы должны использовать
Для диспетчера рабочих процессов (например, Apache Airflow) в случае сбоя операции идемпотентности в вашем конвейере система может автоматически повторить задачу, не затрагивая систему. Даже если журналы меняются, это хорошо, потому что вы можете видеть инцидент.
Наиболее важным в этом случае является то, что ваша система может повторить задачу, которая не удалась, и не испортит конвейер (например, добавление одних и тех же данных в таблицу при каждой попытке).
повторите безопасной.
Обычно это самый простой способ понять его значение в информатике.