Определение идемпотентности
Таким образом, "идемпотенция" может быть определена как:
Действие, которое, если выполнено N раз, имеет тот же эффект, что и выполнение действия только один раз.
Получил это, достаточно легко.
Мой вопрос о тонкости этого определения - это действие, рассматриваемое как идемпотент само по себе, или вы должны также рассмотреть данные, передаваемые в действие?
Позвольте мне пояснить на примере:
Предположим, что у меня есть метод PUT, который обновляет некоторый ресурс, мы будем называть его f(x)
Очевидно, что f(3)
является идемпотентным, если я поставлю 3 в качестве входа. И одинаково очевидно, что f(5)
изменит значение ресурса (т.е. Оно больше не будет 3 или какое-либо значение ранее)
Итак, когда мы говорим об идемпотентности, мы имеем в виду обобщение действия/функции, подобного (т.е. f(x)
), или мы имеем в виду действие/функцию + данные, передаваемые в нее (т.е. f(3)
)?
Ответы
Ответ 1
Предположим, что у меня есть метод PUT, который обновляет некоторый ресурс, мы его будем называть F (X)
Очевидно, что f (3) является идемпотентным, пока я ввожу 3 в качестве входа. А также одинаково очевидно, f (5) изменит значение ресурса (т.е. оно больше не будет 3 или независимо от того, что было ранее).
Это очевидно только в том случае, если реализация сервера такова, что PUT
соответствует этому свойству idempotent. В контексте HTTP RFC 2616 говорит:
Методы могут также обладать свойством "идемпотенции" в этом (в сторону от ошибок или ошибок истечения) побочные эффекты N > 0 идентичныезапросы такие же, как и для одного запроса.
Отвлекитесь от темы...
В распределенной системе, например в Интернете, вы также можете рассмотреть коммутативность и параллельные запросы. Например, N + 1 одного и того же запроса PUT (x1) должен иметь тот же эффект, но вы не знаете, сделал ли другой клиент другой запрос PUT (x2) между вашими, так что в то время как nPUT (x1) = PUT (x1) ) и mPUT (x2) = PUT (x2), два набора запросов могут чередоваться.
Ответ 2
Idempotence требует, чтобы действие выполнялось для всех значений над его доменом, т.е. f(f(x)) = f(x)
для всех x
. Другой способ подумать об этом заключается в том, что операция является идемпотентной, если состав операции с ней - это просто операция.
Ответ 3
Вы предполагаете, что идемпотенция означает, что состояние сервера будет изменено не более одного раза с помощью серии вызовов. Большую часть времени люди используют этот термин для обозначения того, что состояние на сервере не будет изменено никаким количеством вызовов. В этих обстоятельствах различие между вашими двумя случаями несущественно.
Ответ 4
Это не совсем определение идемпотенции. Функция является идемпотентной, если для любого элемента x, f (f (x)) == f (x).
PUT - побочный эффект функции f(), а не результат.