Идемпотентность: слово, которого не было в словаре
Слово: идемпотентность · где услышишь: в шлюзе каналов — «одно событие, не больше одного письма»
«Истории слов» — рубрика буткемпа Hammerhall. Наша команда строит учебную платформу и сервисы вокруг неё, а здесь рассказывает, откуда взялись слова, на которых говорит.
Поздний вечер. Человек покупает билет на поезд: выбрал место, ввёл карту, нажал «оплатить». На экране крутится колёсико. Минуту крутится. Страница зависла.
У человека в голове один вопрос: деньги ушли или нет? Если ушли, второй раз нажимать нельзя. Если не ушли — надо, иначе место уйдёт. Он не знает. И нажимает ещё раз.
Сколько раз с него должны списать деньги? Один, тут все согласны. Чтобы вышло именно один, у программистов есть правило — и у него самое эльфийское имя из всех, что ты у нас услышишь: идемпотентность.
Придумал это слово не программист, а математик, и было это больше 150 лет назад.
Величина, которая остаётся собой
1870 год, США. Бенджамин Пирс (Benjamin Peirce), профессор математики в Гарварде, — он преподавал там почти полвека. Его часто называют первым американским учёным, чью работу признали во всём мире.
В тот год Пирс прочёл перед Национальной академией наук большую работу «Линейная ассоциативная алгебра» (Linear Associative Algebra). Если совсем коротко — о том, как умножать друг на друга не только числа, но и другие величины.
У работы своя маленькая история. Почерк у Пирса был ужасный. Нашли женщину, которая математики не знала, зато писала красиво и умела разбирать его каракули. Она переписала от руки весь текст на литографские камни — гладкие камни, с которых потом печатали, как штампом. С них отпечатали 100 экземпляров и разослали математикам по всему миру.
В этой работе Пирсу понадобились имена для двух странных величин. Первая, если умножать её саму на себя, в какой-то момент исчезает — получается ноль. Её Пирс назвал нильпотентной: nil по-латыни — «ничто». Вторая — наоборот: умножишь на себя — получишь её же, умножишь ещё раз — опять она. Её Пирс назвал идемпотентной: idem — «тот же самый», potens — «имеющий силу». А «сила» по-английски — power, и это же слово значит «степень». Выходит: та же самая в любой степени.
Само это свойство до Пирса записал англичанин Джордж Буль (George Boole) в своей алгебре логики. А имя ему дал Пирс — и оно прижилось.
«Этого слова нет ни в одном словаре»
Сначала слово жило у математиков, потом его подхватили программисты: им понадобилось имя для действий, которые можно спокойно повторить. А в середине 1990-х люди договаривались о правилах, по которым компьютер просит у сайта страницу и получает ответ, — о протоколе HTTP, тех самых буквах из адресов сайтов. В черновик этих правил попало и наше слово.
30 августа 1995 года в переписке рабочей группы HTTP один участник пишет: слово в черновике употребляют путано, совсем не так, как в математике, — давайте определим его или заменим. Другой поддерживает: этого слова нет ни в одном словаре, даже в моём полном Webster's. В тот же день приходит ответ: это математический термин, — а к нему статья из Оксфордского словаря, где первым стоит Пирс и 1870 год.
Так что если слово кажется тебе эльфийским, ты в хорошей компании: один из тех, кто обсуждал правила интернета, тоже искал его в словаре и не нашёл.
Лифт и выключатель#
Слово в правилах осталось. Сегодня там сказано: запрос идемпотентный, если сделать его много раз — то же самое, что сделать один. «Покажи страницу» — такой запрос: покажи хоть десять раз, страница не изменится. «Удали этот файл» — тоже: удалил, и его нет, удалять ещё раз нечего. Такие запросы, по правилам, компьютер может повторить сам, без человека, если связь оборвалась раньше, чем пришёл ответ. А «отправить» или «оплатить» — другое дело: там каждое нажатие — новое действие, и повторять такое вслепую правила не советуют.
Без компьютеров это выглядит так:
| что нажимаешь | что делает повтор | идемпотентно? |
|---|---|---|
| кнопку вызова лифта | ничего: лифт уже едет | да |
| кнопку «выключить» | ничего: свет уже выключен | да |
| выключатель туда-сюда | отменяет первое нажатие | нет |
А как же оплата? Кнопка «оплатить» сама по себе не идемпотентна — идемпотентной её делают нарочно. К покупке прикладывают номер, один на все нажатия. Платёжная система его запоминает и, если приходит второй запрос с тем же номером, отвечает то же, что в первый раз: оплачено. Второй раз деньги не списывает. Так что, если магазин сделан аккуратно, нашему человеку с зависшей страницей второе нажатие не страшно.
Сколько бы раз ни постучалось
У нас это слово услышишь в шлюзе каналов — сервисе команды, который пишет людям уведомления на почту. Шлюз читает события платформы. Событие — короткая записка о том, что случилось: «ментору пришла новая заявка» или «задание проверено». А повторы — дело обычное: платформа честно предупреждает, что одно событие может прийти дважды, например после сбоя или перезапуска.
Поэтому у шлюза правило: одно событие — не больше одного письма. Ментор получит письмо о новой заявке один раз, сколько бы раз событие ни постучалось.
И ещё одна мысль, ради которой слово звучит у нас так часто: повторы гасит не надежда, что повтора не будет, а память. Отсюда принцип: у шлюза своя база — его память, и каждое обработанное событие в ней отмечается. Пришло то же событие снова — отметка уже есть, второго письма не будет. Не потому, что повезло, а потому, что так задумано. Подробности — разговор для тех, кто строит шлюз; тебе хватит самой идеи.
Пирс так назвал величину, которая от умножения на себя остаётся собой. А мы так называем действие, которое от повтора остаётся одним.
Идемпотентность — это когда жмёшь пять раз, а случается один.
Источники
- Benjamin Peirce, «Linear Associative Algebra», перепечатка 1881 года — первоисточник: §25, где появляются слова nilpotent и idempotent.
- Рабочая группа HTTP, переписка 30.08.1995 — «idempotent is not in any dictionary»; рядом в архиве — ответ со статьёй Оксфордского словаря.
- RFC 9110, «HTTP Semantics», §9.2.2 — что такое идемпотентный запрос в сегодняшних правилах HTTP.
- Stripe, «Idempotent requests» — как платёжная система не списывает деньги дважды.
- Stanford Encyclopedia of Philosophy, «Benjamin Peirce» — кто такой Пирс, история литографского издания, свойство у Буля.