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

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

вопрос задан 3.07.2009
Will
9033 репутация

16 ответов


  • 715 рейтинг

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

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


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

    ответ дан Greg Hewgill, с репутацией 645957, 3.07.2009
  • 106 рейтинг

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

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

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

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

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

    ответ дан Jim Ferrans, с репутацией 21103, 3.07.2009
  • 78 рейтинг

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

    ответ дан Robert, с репутацией 2156, 3.07.2009
  • 41 рейтинг

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

    Примеры:

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

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

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

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

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

    ответ дан mikera, с репутацией 85678, 5.03.2012
  • 22 рейтинг

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

    ответ дан Caleb Huitt - cjhuitt, с репутацией 12754, 3.07.2009
  • 10 рейтинг

    Просто хотел выбросить реальный случай использования, который демонстрирует идемпотентность. В 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');
    
    ответ дан Lance Pollard, с репутацией 30294, 9.10.2013
  • 8 рейтинг

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

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

    ответ дан Mahmoud Abou-Eita, с репутацией 468, 6.12.2012
  • 6 рейтинг

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

    Идемпотент = Перезапускаемый

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

    ответ дан Manish Basantani, с репутацией 8208, 13.08.2015
  • 6 рейтинг

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

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

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

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

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

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

    ответ дан nmit026, с репутацией 1080, 3.08.2015
  • 6 рейтинг

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

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

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

    ура

    ответ дан Arnkrishn, с репутацией 15616, 3.07.2009
  • 5 рейтинг

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

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

    ответ дан Oorang, с репутацией 5214, 3.07.2009
  • 4 рейтинг

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

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

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

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

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

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

    ответ дан BERGUIGA Mohamed Amine, с репутацией 3457, 3.08.2015
  • 0 рейтинг

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

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

    POST, с другой стороны, это тип запроса, который вы используйте для отправки транзакции по кредитной карте, добавьте альбом в корзину или смените пароль. ПОЧТОВЫЙ запрос обычно изменяет состояние на сервере и повторяет запрос может привести к нежелательным последствиям (например, двойной биллинг). Многие браузеры помогают пользователю избежать повторения запрос POST.

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

    ответ дан user2211290, с репутацией 551, 23.03.2016
  • 0 рейтинг

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

    ответ дан Leonid Ganeline, с репутацией 390, 7.11.2013
  • 0 рейтинг

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

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

    ответ дан Marcus Thornton, с репутацией 2933, 25.03.2016
  • -2 рейтинг

    , безопасный для повторных попыток.

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

    ответ дан teknopaul, с репутацией 3920, 6.04.2017