В модели Terraform каждая операция в плане, как ожидается, будет завершенным и автономным действием, которое переводит систему в согласованное состояние, в котором наблюдаются внешне видимые побочные эффекты, и нет другого переходного состояния. Этот дизайн особенно важен для конфигураций, которые смешивают ресурсы нескольких разных провайдеров вместе, где другой провайдер может зависеть от уже видимого извне промежуточного результата, такого как:
- Создать вещь X в системе Использование провайдера A
- Создание вещи Y в системе B, которая зависит от вещи X, с использованием провайдера B
- Создание вещи Z в системе A, которая зависит от вещи Y, с использованием провайдера A
Для многих целевых систем это происходит "бесплатно" как естественный побочный эффект REST-подобного проектирования API: сами операции мутации предназначены для перехода системы между согласованными состояниями, и новое состояние сразу видно после завершения операции. (с некоторыми оговорками о возможной согласованности и т. д. c)
Эта модель сложнее для систем с более сложным жизненным циклом, таких как ожидание внесения пакета изменений перед тем, как "совершить" их, чтобы они видимые побочные эффекты. Обычный способ их моделирования в Terraform состоит в том, чтобы каждое отдельное изменение ограничивало себя, а не пыталось разграничить общий набор изменений.
Другими словами, каждое отдельное действие должно рассматриваться как отдельная «транзакция». , который должен быть полностью применен, и все его переходные состояния должны быть завершены до того, как провайдер вернется.
В некоторых особенно сложных системах может быть необходимо сериализовать эти "транзакции", потому что может быть только одна открывать одновременно. В этом случае поставщик может использовать обычный мьютекс Go, чтобы гарантировать, что одновременно может выполняться только одна операция этого поставщика. Это уменьшит способность Terraform выполнять действия одновременно, но это неизбежно, если удаленная система требует сериализации действий.
Обратите также внимание, что пользователи могут написать более одной конфигурации для одного и того же поставщика, используя конфигурации альтернативного поставщика , и в этом случае плагин вашего провайдера будет запускаться несколько раз одновременно без встроенной возможности координировать действия между ними. В этом случае действия для одного экземпляра поставщика будут выполняться одновременно с действиями для другого, поскольку эти экземпляры полностью отделены друг от друга (отдельный процесс ОС, выполняющий ту же программу).