Что такое идемпотентная операция?
Что такое идемпотентная операция?
15 ответов
в вычислениях идемпотентная операция-это операция, которая не имеет дополнительного эффекта, если она вызывается более одного раза с одинаковыми входными параметрами. Например, удаление элемента из набора можно считать идемпотентной операцией на множестве.
в математике идемпотентная операция-это та, где f(f(x)) = f (x). Например,abs()
функция является тождественной, так как abs(abs(x)) = abs(x)
для всех x
.
это немного разные определения могут быть примиряется, считая, что x в математическом определении представляет состояние объекта, и f - это операция, которая может изменить этот объект. Например, рассмотрим!--19-->Python set
и discard
метод. The discard
метод удаляет элемент из набора, и ничего не делает, если элемент не существует. Итак:
my_set.discard(x)
имеет точно такой же эффект, как выполнение той же операции дважды:
my_set.discard(x)
my_set.discard(x)
идемпотентные операции часто используются при разработке сетевых протоколов, где запрос на выполнение операции гарантированно происходит хотя бы один раз, но может также произойти несколько раз. Если операция идемпотентна, то нет никакого вреда в выполнении операции в два или более раз.
см. статью Википедии на idempotence для получения дополнительной информации.
вышеуказанный ответ ранее имел некоторые неверные и вводящие в заблуждение примеры. Комментарии ниже, написанные до апреля 2014 года, относятся к более старой редакции.
идемпотентная операция может быть повторена произвольное число раз и результат будет тот же, как если бы это было сделано только один раз. В арифметике добавление нуля к числу является идемпотентным.
Idempotence много говорят в контексте "RESTful" веб-сервисов. REST стремится максимально использовать HTTP для предоставления программам доступа к веб-контенту и обычно устанавливается в отличие от веб-служб на основе SOAP, которые просто туннелируют службы стиля удаленного вызова процедур внутри HTTP просьбы и ответы.
REST организует веб-приложение в "ресурсы" (например, пользователь Twitter или изображение Flickr), а затем использует HTTP-глаголы POST, PUT, GET и DELETE для создания, обновления, чтения и удаления этих ресурсов.
Idempotence играет важную роль в отдыхе. Если вы получите представление ресурса REST (например, получите изображение jpeg из Flickr), и операция завершится неудачно, вы можете просто повторять GET снова и снова, пока операция не завершится успешно. К веб-служба, не имеет значения, сколько раз изображение получено. Аналогично, если вы используете веб-службу RESTful для обновления информации об учетной записи Twitter, вы можете поместить новую информацию столько раз, сколько потребуется, чтобы получить подтверждение от веб-службы. Повторять это тысячу раз-то же самое, что повторять один раз. Аналогично удаление ресурса REST тысячу раз совпадает с его удалением один раз. Таким образом, идемпотенция упрощает создание веб-службы, которая устойчива ошибок связи.
читайте далее: RESTful Web Services, Ричардсона и Руби (идемпотенция обсуждается на стр. 103-104), и Роя Филдинга докторская диссертация по отдыху. Филдинг был одним из авторов HTTP 1.1, RFC-2616, который говорит об идемпотенции в 9.1.2.
Идемпотенция означает, что применение операции один раз или применение ее несколько раз имеет тот же эффект.
примеры:
- умножение на ноль. Независимо от того, сколько раз вы это делаете, результат по-прежнему равен нулю.
- установка логического флага. Независимо от того, сколько раз вы это делаете, флаг остается установленным.
- удаление строки из базы данных с указанным идентификатором. Если вы попробуете еще раз, ряд все равно исчезнет.
на чистый функции (функции без побочных эффектов) тогда идемпотентность подразумевает, что f(x) = f(f(x)) = f(f(f(x))) = f(f(f(x)))=...... для всех значений x
на функции с побочными эффектами, идемпотентность furthermore подразумевает что никакие дополнительные побочные эффекты не будут причинены после первого применения. Вы можете рассматривать состояние мира как дополнительный "скрытый" параметр функции, если хотите.
обратите внимание, что в мире, где ты есть при одновременных действиях вы можете обнаружить, что операции, которые вы считали идемпотентными, перестают быть таковыми (например, другой поток может отменить значение логического флага в приведенном выше примере). В основном, когда у вас есть параллелизм и изменяемое состояние, вам нужно гораздо более тщательно подумать об идемпотентности.
идемпотентность часто является полезным свойством при построении надежных систем. Например, если существует риск того, что вы можете получить дубликат сообщения от третьей стороны, это полезно, чтобы обработчик сообщений действовал как идемпотентная операция, так что эффект сообщения происходит только один раз.
идемпотентная операция дает результат в том же состоянии, даже если вы называете это несколько раз, вы в те же параметры.
просто хотел выбросить реальный случай использования, который демонстрирует идемпотентность. В JavaScript, скажем, вы определяете кучу классов модели (как в модели MVC). Как это часто реализуется функционально эквивалентен примерно так (простой пример):
function model(name) {
function Model() {
this.name = name;
}
return Model;
}
затем вы можете определить новые классы следующим образом:
var User = model('user');
var Article = model('article');
но если вы попытаетесь получить User
класса по model('user')
откуда-то еще в коде, это будет fail:
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');
Идемпотентные Операции: операции, которые не имеют побочных эффектов, если выполняется несколько раз.
пример: операция, которая извлекает значения из ресурса данных и, скажем, печатает его
Идемпотентными Операциями: операции, которые причинят некоторый вред, если выполняются несколько раз. (Поскольку они изменяют некоторые значения или состояния)
пример: операция, которая выводит средства с банковского счета
идемпотентная операция над набором оставляет его члены неизменными при применении один или несколько раз.
Это может быть унарная операция, как Абсолют (x) где x принадлежит множеству натуральных чисел. Здесь Абсолют(absolute (x)) = x.
Это может быть двоичная операция, как союз с самим собой. всегда будет возвращать один и тот же набор.
ура
идемпотентная операция-это операция, действие или запрос, которые могут применяться несколько раз без изменения результата, т. е. состояния системы, за пределами начального приложения.
ПРИМЕРЫ (КОНТЕКСТ ВЕБ-ПРИЛОЖЕНИЯ):
NULLIPOTENT: Если операция не имеет побочных эффектов, таких как простое отображение информации на веб-странице без каких-либо изменений в базе данных (другими словами, вы только читаете базу данных), мы говорим, что операция NULLIPOTENT. Все должно быть nullipotent. В противном случае используйте POST.
ИДЕМПОТЕНТ: Сообщение в системе обмена сообщениями электронной почты открывается и помечается как "открыто" в базе данных. Можно открывать сообщение много раз, но это повторное действие приведет только к тому, что сообщение будет находиться в состоянии "открыто". Это идемпотентная операция.
НЕ ИДЕМПОТЕНТНЫЙ: Если операция всегда вызывает изменение состояния, например, повторное размещение одного и того же сообщения пользователю, в результате чего новое сообщение отправляется и сохраняется в в базе данных каждый раз мы говорим, что операция не является ИДЕМПОТЕНТНОЙ.
говоря о состоянии системы, мы, очевидно, игнорируем, надеюсь, безвредные и неизбежные эффекты, такие как ведение журнала и диагностика.
довольно подробные и технические ответы. Просто добавляю простое определение.
Идемпотент = повторно запускаемый
например,
Create
операция сама по себе не гарантируется без ошибок при выполнении более одного раза.
Но если есть операция CreateOrUpdate
затем он указывает на повторную запускаемость (идемпотентность).
это любая операция, что каждый N-й результат приведет к выходу, соответствующему значению 1-го результата. Например, абсолютное значение -1 1. Абсолютное значение абсолютное значение -1 1. Абсолютное значение абсолютное значение абсолютное значение -1 1. И так далее.
см. также: Когда будет действительно глупо использовать рекурсию?
идемпотентные методы
идемпотентный метод-это метод, который будет производить те же результаты, независимо от того, сколько раз он называется.
на
GET
метод является идемпотентным, так как несколько вызовов ресурса GET всегда будут возвращать один и тот же ответ.на
PUT
метод является идемпотентным, так как вызов метода PUT несколько раз обновит один и тот же ресурс и не изменит результат.на
POST
не является идемпотентным, и вызов метода POST несколько раз может имеют разные результаты и приведут к созданию новых ресурсов.на
DELETE
является идемпотентным, потому что после удаления ресурса он исчезнет и вызов метода несколько раз не изменит результат.
мой 5c: В интеграции и сети идемпотентность очень важна. Несколько примеров из реальной жизни: Представьте, мы доставляем данные в целевую систему. Данные доставляются последовательностью сообщений. 1. Что произойдет, если последовательность будет смешана в канале? (Как это всегда делают сетевые пакеты:)). Если целевая система является идемпотентной, результат не будет отличаться. Если целевая система зависит от правильного порядка в последовательности, мы должны реализовать resequencer на целевом сайте, который восстановит правильный порядок. 2. Что произойдет, если будут дубликаты сообщений? Если канал целевой системы не подтверждает своевременность, исходная система (или сам канал) обычно отправляет другую копию сообщения. В результате мы можем иметь дублирующее сообщение на стороне целевой системы. Если целевая система является идемпотентной, она заботится о ней, и результат не будет отличаться. Если целевая система не является идемпотентной, мы должны реализовать deduplicator на целевой стороне системы канал.
короче, идемпотентные операции означает, что операция не приведет к различным результатам независимо от того, сколько раз вы работаете идемпотентные операции.
например, согласно определению спецификации HTTP,GET, HEAD, PUT, and DELETE
идемпотентные операции, однако POST and PATCH
нет. Вот почему иногда POST заменяется патчем.