Лекция
Привет, Вы узнаете о том , что такое идемпотентность, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое идемпотентность, идемпотентный элемент, идемпотент, тестирование идемпотентности , настоятельно рекомендую прочитать все из категории Разработка программного обеспечения и информационных систем.
идемпотент ность (лат. idem — тот же самый + potens — способный) — свойство объекта или операции при повторном применении операции к объекту давать тот же результат, что и при первом. Термин предложил американский математик Бенджамин Пирс (англ. Benjamin Peirce) в статьях 1870-х годов.
Если сообщение естественно идемпотентно, то повторная обработка сообщения несколько раз приводит к одному и тому же значению, например, f (x) = f (f (x)).
Примеры идемпотентных операций:
идемпотентный элемент (идемпотент) в алгебре — элемент полугруппы, сохраняющийся при умножении самого на себя: . Теорема об идемпотенте гласит: в конечной полугруппе есть идемпотент.
Идемпотентный элемент содержит идемпотентный элемент (обозначается ), если . Отношение является отношением частичного порядка в множестве идемпотентных элементов и называется естественным частичным порядком на множестве .
Два идемпотентных элемента ассоциативного кольца (которое будет полугруппой по умножению) и называются ортогональными, если .
Идемпотентная бинарная операция в математике — операция, относительно которой всякий элемент обладает идемпотентностью в вышеназванном смысле:
.
Этим свойством обладают, например, логическое И и логическое ИЛИ.
Идемпотентная унарная операция — операция, для которой выполняется , или .
Из линейных операторов в идемпотентны только тождественный оператор, нулевой оператор и параллельная проекция. Об этом говорит сайт https://intellect.icu . Поэтому проектор в алгебре — в том числе в бесконечномерных пространствах — определяется как .
Идемпотентная операция в информатике — действие, многократное повторение которого эквивалентно однократному.
Примером такой операции могут служить GET-запросы в протоколе HTTP. По спецификации, сервер должен возвращать идентичные ответы на идентичные GET-запросы (при условии, что ресурс не изменился). Это позволяет корректно кэшировать эти ответы, снижая нагрузку на сеть.
Для препроцессора языка Си директива «#include "xxx.h"
» является идемпотентной, если в заголовочном файле есть защита от двойного включения.
В информатике термин идемпотентность может иметь разное значение в зависимости от контекста, в котором он применяется:
Это очень полезное свойство во многих ситуациях, поскольку оно означает, что операцию можно повторять или повторять столько раз, сколько необходимо, без возникновения непредвиденных эффектов. При неидемпотентных операциях алгоритму, возможно, придется отслеживать, была ли операция уже выполнена или нет.
Функция, ищущая имя и адрес клиента в базе данных , обычно идемпотентна, так как это не приведет к изменению базы данных. Точно так же изменение адреса клиента на XYZ обычно идемпотентно, потому что окончательный адрес будет одним и тем же независимо от того, сколько раз отправляется XYZ. Однако размещение заказа на тележку для клиента обычно не идемпотентно, поскольку выполнение вызова несколько раз приведет к размещению нескольких заказов. Отмена заказа идемпотентна, потому что заказ остается отмененным независимо от количества сделанных запросов.
Однако композиция идемпотентных методов или подпрограмм не обязательно является идемпотентной, если более поздний метод в последовательности изменяет значение, от которого зависит более ранний метод - идемпотентность не закрывается при композиции . Например, предположим, что начальное значение переменной равно 3, и существует последовательность, которая считывает переменную, затем изменяет ее на 5, а затем читает ее снова. Каждый шаг в последовательности идемпотентен: оба шага, считывающие переменную, не имеют побочных эффектов, и изменение переменной на 5 всегда будет иметь один и тот же эффект, независимо от того, сколько раз она выполняется. Тем не менее, однократное выполнение всей последовательности дает результат (3, 5), а повторное выполнение дает результат (5, 5), поэтому последовательность не идемпотентна.
В протоколе передачи гипертекста (HTTP) идемпотентность и безопасность являются основными атрибутами, разделяющими HTTP-глаголы . Из основных HTTP-глаголов GET, PUT и DELETE должны быть реализованы идемпотентным образом в соответствии со стандартом, но POST не обязательно. [15] GET извлекает ресурс; PUT хранит контент на ресурсе; а DELETE удаляет ресурс. Как и в приведенном выше примере, чтение данных обычно не имеет побочных эффектов, поэтому оно идемпотентно (фактически нуль-потенциал). Хранение и удаление заданного набора контента обычно являются идемпотентными, если в запросе указывается местоположение или идентификатор, который однозначно идентифицирует этот ресурс и только этот ресурс в будущем. Операции PUT и DELETE с уникальными идентификаторами сводятся к простому случаю присвоения неизменной переменной либо значения, либо нулевого значения, соответственно, и являются идемпотентными по той же причине; конечный результат всегда совпадает с результатом первоначального выполнения, даже если ответ отличается.
Нарушение требования уникальной идентификации при хранении или удалении обычно вызывает нарушение идемпотентности. Например, сохранение или удаление заданного набора контента без указания уникального идентификатора: запросы POST, которые не обязательно должны быть идемпотентными, часто не содержат уникальных идентификаторов, поэтому создание идентификатора делегируется принимающей системе, которая затем создает соответствующий новый рекорд. Точно так же запросы PUT и DELETE с неспецифическими критериями могут приводить к разным результатам в зависимости от состояния системы - например, запрос на удаление самой последней записи. В каждом случае последующие исполнения будут дополнительно изменять состояние системы, поэтому они не будут идемпотентными.
При обработке потока событий идемпотентность относится к способности системы выдавать одинаковый результат, даже если один и тот же файл, событие или сообщение было получено более одного раза.
В архитектуре загрузки-хранилища инструкции, которые могут вызвать сбой страницы, являются идемпотентными. Таким образом, если происходит сбой страницы, ОС может загрузить страницу с диска, а затем просто повторно выполнить команду с ошибкой. В процессоре, где такие инструкции не идемпотентны, обработка ошибок страниц намного сложнее.
При переформатировании вывода ожидается , что красивая печать будет идемпотентной. Другими словами, если результат уже «красивый», то самому красивому принтеру делать нечего.
В сервис-ориентированной архитектуре (SOA) многоступенчатый процесс оркестровки, полностью состоящий из идемпотентных шагов, может быть воспроизведен без побочных эффектов, если какая-либо часть этого процесса выйдет из строя.
Многие идемпотентные операции часто имеют способы «возобновить» процесс, если он был прерван, - способы, которые заканчиваются намного быстрее, чем запуск всего с самого начала. Например, возобновление передачи файлов , синхронизация файлов , создание сборки программного обеспечения , установка приложения и всех его зависимостей с помощью диспетчера пакетов и т. д.
Идемпотентность означает, что выполнение одной и той же операции несколько раз подряд будет иметь тот же эффект, что и выполнение ее один раз.
Например, установка переменной x в 5 является идемпотентной. Вы можете установить x на 5 один раз или миллион раз. Это все еще будет 5. Однако увеличение X на 1 не идемпотентно. Каждое последовательное увеличение меняет свое значение. Идемпотентность является очень желательным свойством в распределенных системах с временными сетевыми разделами и протоколами восстановления, которые повторяют отправку сообщения несколько раз, если нет немедленного ответа.
Если вы создаете идемпотентность в своем коде доступа к данным, вы должны проверить это. Это обычно очень просто. Для каждой идемпотентной операции вы продлеваете выполнение операции дважды или более подряд и проверяете, что ошибок нет, и состояние остается тем же.
Обратите внимание, что идемпотентный дизайн может иногда скрывать ошибки. Подумайте об удалении записи из DB. Это идемпотентная операция. После удаления записи ее больше не существует в системе, и попытка удалить ее снова не вернет ее. Это означает, что попытка удалить несуществующую запись является допустимой операцией. Но это может скрывать тот факт, что вызывающий абонент передал неправильный ключ записи. Если вы вернете сообщение об ошибке, то оно не идемпотентно.
Разработка feature (функциональности) — это разработка программного обеспечения, а оно обязательно должно проходить стадию тестирования, это неотъемлемая часть SDLC (Software Development Life Cycle).
Тестировать роли можно по-разному. Вот сценарии, с которыми сталкивался лично я:
Вначале можно использовать недорогой вариант: для каждой роли сделали прогон на тестовой сущности, которая воспроизводила аналогичную сущность в живом окружении и была на нее максимально похожа. Реализовано это на базе Docker-контейнеров.Берем feature , прогоняем ее для каждого вида ОС в параллели и смотрим, что она выполнилась успешно и не упала. Прогоняем второй раз, чтобы убедиться, что она идемпотентна и не вносит дополнительных изменений. Это самое простое и дешевое тестирование, которое можно сделать. Да, оно не идеально, но уже дает вам уверенность в том, что feature будет успешно завершена и сможет многократно применяться на существующих ресурсах без риска сломать что-либо.
Прогонять эти тесты вручную нам не хотелось. Мы давно используем CI для выкатки изменений Terraform и решили, что тестированием будет заниматься компьютер. Но как это автоматизировать, чтобы все, что не относится напрямую к разработке роли действия, делалось компьютером, а не человеком?
На каждый коммит, уходящий на сервер GitLab, запускается простой pipeline, который тестирует измененную feature . Когда инженер хочет внести изменение в feature , он создает новую ветку для изменения, пишет код, делает commit изменений и push на сервер. На сервере по событию запускается pipeline, который состоит из минимум трех этапов:
Прикладные примеры, с которыми многие люди могут столкнуться в своей повседневной жизни, включают кнопки вызова лифта и кнопки перехода . Первоначальное нажатие кнопки переводит систему в состояние запроса, пока запрос не будет удовлетворен. Последующие активации кнопки между первоначальной активацией и удовлетворением запроса не имеют никакого эффекта, если только система не предназначена для настройки времени для удовлетворения запроса на основе количества активаций.
Данная статья про идемпотентность подтверждают значимость применения современных методик для изучения данных проблем. Надеюсь, что теперь ты понял что такое идемпотентность, идемпотентный элемент, идемпотент, тестирование идемпотентности и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Разработка программного обеспечения и информационных систем
Комментарии
Оставить комментарий
Разработка программного обеспечения и информационных систем
Термины: Разработка программного обеспечения и информационных систем