Определение идемпотентности

Таким образом, "идемпотентность" может быть определена как:

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

Понял, достаточно просто.

Мой вопрос о тонкости этого определения - само действие считается идемпотентным, или вы должны также учитывать данные, передаваемые в действие?

Позвольте мне уточнить на примере:

Предположим, у меня есть метод PUT, который обновляет некоторый ресурс, мы назовем его f(x)

Очевидно, что f(3) идемпотентен, пока я поставляю 3 как вход. И в равной степени очевидно, f(5) изменит значение ресурса (то есть больше не будет 3 или того значения, которое было ранее)

Поэтому, когда мы говорим об идемпотентности, мы имеем в виду обобщение действия / функции наподобие (т.е. f(x)), или мы имеем в виду действие / функцию + данные, передаваемые в нее (т.е. f(3))?

4 ответа

Решение

Предположим, у меня есть метод PUT, который обновляет некоторый ресурс, мы назовем его f (x)

Очевидно, что f(3) идемпотентна, если я поставлю 3 в качестве входа. И в равной степени очевидно, что f(5) изменит значение ресурса (т. Е. Больше не будет 3 или того значения, которое было там ранее).

Это только очевидно, если реализация сервера такова, что PUT уважает это идемпотентное свойство. В контексте HTTP RFC 2616 говорит:

Методы также могут обладать свойством "идемпотентности", заключающимся в том, что (кроме ошибок, связанных с ошибками или истечением срока), побочные эффекты от N > 0 идентичных запросов такие же, как и для одного запроса.

Немного не по теме... В распределенной системе, такой как Интернет, вы также можете рассмотреть коммутативность и одновременные запросы. Например, N+1 того же запроса PUT(x1) должен иметь такой же эффект, но вы не знаете, сделал ли другой клиент другой запрос PUT(x2) между вами, поэтому пока nPUT(x1) = PUT(x1) и m PUT(x2) = PUT(x2), два набора запросов могут чередоваться.

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

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

Это не совсем определение идемпотентности. Функция идемпотентна, если для любого элемента x f (f (x)) == f (x).

PUT - это побочный эффект вашей функции f(), а не ее результат.

Другие вопросы по тегам