SeniorPython Developer > Основы Python > Транзакции и конкурентность
Короткий ответ 2PC даёт строгую атомарность между несколькими БД за счёт координатора, который синхронно удерживает блокировки на всех участниках до commit, но плохо масштабируется и уязвим к недоступности координатора/участника; Saga разбивает операцию на последовательность локальных транзакций с компенсирующими действиями на случай неудачи, что масштабируется лучше, но требует продумывания каждой компенсации и временного окна промежуточной неконсистентности. Как это работает подробнее 2PC проходит через фазу подготовки (каждый участник резервирует изменения и сообщает «готов») и фазу коммита — пока не пройдена вторая фаза, ресурсы у всех участников заблокированы; Saga выполняет шаги последовательно как независимые локальные транзакции, и при ошибке запускает заранее определённые компенсирующие операции для уже выполненных шагов. Сравнение Компромисс. Выбор зависит от требуемой строгости согласованности (мгновенная vs eventual), числа и разнородности участников, частоты операций и готовности команды поддержи
concurrencypostgresql
SeniorDevOps Engineer > Контейнеры и доставка > Безопасность и DevSecOps
Короткий ответ Явного единственно верного ответа нет: NetworkPolicy контролирует, какие пары Pod/namespace могут обмениваться трафиком на уровне L3/L4, но не даёт криптографической аутентификации и шифрования самого трафика между сервисами; service mesh с mTLS добавляет именно это, но вносит дополнительную операционную сложность (sidecar, управление сертификатами, отладка), которая оправдана не для каждой платформы. Как это работает подробнее NetworkPolicy — это decision на уровне сети (IP/порт/namespace/label), реализуемый CNI; она не проверяет, что трафик действительно пришёл от ожидаемого сервиса, а не от скомпрометированного Pod с подменённым IP в разрешённом диапазоне. Service mesh (Istio, Linkerd) внедряет sidecar-прокси в каждый Pod, который устанавливает mTLS-соединение на основе криптографической идентичности сервиса (а не IP), и может дополнительно применять L7-политики (по HTTP-методам, путям). Сравнение Компромисс. service mesh даёт сильную криптографическую изоляцию и детальную L7-видимость/контр
kubernetesmtls
SeniorDevOps Engineer > Контейнеры и доставка > Облачные платформы
Короткий ответ При десятках сетей hub-and-spoke почти всегда управляемее, чем peering-mesh, за счёт линейного роста подключений и единой точки применения политик, но это не универсальная истина — выбор зависит от требуемой изоляции между командами, допустимой дополнительной задержки через хаб и готовности инвестировать в эксплуатацию дополнительного централизованного компонента. Как это работает подробнее hub-and-spoke концентрирует межсетевую маршрутизацию и, опционально, инспекцию трафика в одном месте, через которое логически проходит трафик между spoke-сетями, что даёт единую точку применения политик безопасности; peering-mesh оставляет маршрутизацию и политики распределёнными по каждой паре сетей, что проще для малого числа сетей, но быстро усложняет аудит на масштабе. Пример кода Что использовать на практике Рекомендация. решение принимают с учётом трёх факторов — сколько сетей нужно связать и как быстро растёт их число, нужна ли централизованная инспекция трафика между командами по требованиям безопасн
cloud-networkingfirewall
SeniorDevOps Engineer > Контейнеры и доставка > Облачные платформы
Короткий ответ Типичный подход — размещать все вычислительные ресурсы в приватных подсетях без публичных IP и подключаться к управляемым облачным сервисам через приватные конечные точки (private endpoints/private service connect) внутри сети вместо обращения к их публичным эндпоинтам через интернет; степень строгости — предмет явного компромисса между безопасностью и операционной нагрузкой. Как это работает подробнее приватные конечные точки создают сетевой интерфейс управляемого сервиса прямо внутри сети клиента, так что трафик к нему никогда не выходит в публичный интернет; это закрывает большой класс рисков ценой необходимости явно создавать и поддерживать точку подключения для каждого нужного сервиса и региона. Пример кода Что использовать на практике Рекомендация. начинают с инвентаризации всех внешних зависимостей сервиса и для каждой облачной зависимости включают приватное подключение, если оно поддерживается; для действительно внешних зависимостей (сторонние API вне облака) трафик неизбежно идёт через
cloud-networkingcompliance
SeniorPython Developer > Основы Python > Архитектура баз данных
Короткий ответ Триггеры БД гарантируют, что ни одно изменение не пройдёт мимо аудита независимо от того, через какой код/сервис оно сделано (включая ручные правки через psql), но усложняют миграции и могут быть «невидимы» для разработчиков, читающих только код приложения; аудит на уровне приложения более прозрачен и прост в сопровождении, но не защищает от изменений в обход этого кода. Как это работает подробнее Триггер AFTER INSERT/UPDATE/DELETE может автоматически писать старые/новые значения строки (через OLD/NEW) в таблицу аудита в той же транзакции, что и само изменение; приложение-уровневый подход явно формирует запись аудита в коде обработчика, часто вместе с бизнес-семантикой изменения. Сравнение Компромисс. Наиболее надёжный по полноте вариант — комбинация триггеров (или CDC/Debezium в отдельное хранилище) для гарантии «ничего не прошло мимо» и приложения для обогащения бизнес-контекстом; выбор зависит от строгости требований комплаенса, объёма изменений (триггеры добавляют накладные расходы на кажду
audit-logdatabase-architecture
MiddleDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ Несколько Ingress-контроллеров в одном кластере нужны, когда разным группам трафика требуются разные возможности или изоляция — например, отдельный публичный внешний контроллер и отдельный внутренний для служебных сервисов, или разные вендоры (NGINX и облачный ALB-контроллер) для разных типов нагрузки; поле ingressClassName в объекте Ingress явно указывает, какой контроллер должен обрабатывать именно это правило. Как это работает подробнее каждый Ingress-контроллер при запуске слушает (через механизм watch) только те объекты Ingress, у которых ingressClassName совпадает с его собственным IngressClass, либо, если IngressClass помечен как default, обрабатывает Ingress без явно указанного класса. Без явного указания класса при наличии нескольких контроллеров поведение становится неоднозначным — в зависимости от конфигурации либо ни один контроллер не возьмёт объект, либо он будет случайно обработан "дефолтным". Пример кода Что использовать на практике Практика. разделение на внешний и внутренний I
ingresskubernetes
JuniorPython Developer > Основы Python > Тестирование кода
Короткий ответ setUp выполняется перед каждым тестовым методом класса и готовит общее состояние (объекты, соединения), а tearDown выполняется после каждого теста и освобождает ресурсы, независимо от того, прошёл тест или упал. Как это работает подробнее unittest вызывает setUp перед вызовом каждого test_* метода этого класса, а tearDown — сразу после, даже если тест завершился исключением или неудачным assert, а не только при успешном завершении. Это гарантирует, что ресурсы (файлы, соединения, временные директории), открытые в setUp, не утекают между тестами и не накапливаются при большом наборе тестов. Пример кода Что использовать на практике Практика. setUp/tearDown удобны для простых повторяющихся приготовлений в рамках одного класса тестов, но при более сложной иерархии зависимостей pytest-фикстуры с разным scope часто оказываются гибче, позволяя переиспользовать подготовку между разными классами и модулями без дублирования кода. Подводные камни Риск. Делать tearDown зависимым от того, что setUp отработа
fixturespython
JuniorDevOps Engineer > Контейнеры и доставка > Infrastructure as Code и управление конфигурацией
Короткий ответ output возвращает значения атрибутов ресурсов после apply (например, IP адрес, ARN, URL) для использования человеком, CI/CD-пайплайном или другим модулем/конфигурацией; посмотреть их повторно можно командой terraform output без необходимости что-либо применять заново. Как это работает подробнее значения outputs сохраняются в state вместе с ресурсами; terraform output просто читает их оттуда, а terraform output -json отдаёт их в машиночитаемом формате для скриптов. Пример кода Что использовать на практике Практика. outputs часто используют для передачи данных между слоями инфраструктуры (например, сетевой модуль выводит vpc_id, а конфигурация приложения читает его через terraform_remote_state data source или напрямую как output родительского модуля); в CI/CD output с адресом балансировщика можно подставить в smoke-тест после деплоя. Подводные камни Ошибка. пытаться получить output до первого успешного apply (значения просто отсутствуют в state); выводить чувствительные данные (пароли) в output б
configuration-managementiac
MiddlePython Developer > Основы Python > Исключения и контекстные менеджеры
Короткий ответ raise ... from original_error явно связывает новое исключение с исходным через атрибут __cause__, фиксируя в трассировке осознанную причину "одна ошибка вызвала другую"; без from при повторном raise внутри except исходное исключение всё равно попадает в трассировку через неявный __context__, но как побочный эффект обработки, а не как явно задокументированная причина. Как это работает подробнее Когда внутри except OriginalError: возбуждают новое исключение, Python автоматически сохраняет текущее исключение в атрибуте __context__ нового — это видно в трассировке как "During handling of the above exception, another exception occurred". raise New(...) from original дополнительно устанавливает __cause__ = original и меняет текст в трассировке на явное "The above exception was the direct cause of the following exception", что сигнализирует намеренную трансформацию ошибки, а не случайную. Пример кода Что использовать на практике Практика. Такой паттерн используют, когда низкоуровневая ошибка (например
exception-chainingexceptions
JuniorDevOps Engineer > Контейнеры и доставка > Infrastructure as Code и управление конфигурацией
Короткий ответ Ansible Vault шифрует файлы (или отдельные строки) с чувствительными данными симметричным шифрованием по паролю/ключу, позволяя безопасно хранить секреты в репозитории рядом с остальным кодом и расшифровывать их только во время выполнения playbook. Как это работает подробнее команда ansible-vault encrypt шифрует YAML-файл целиком (AES256) под паролем, который хранится отдельно (менеджер секретов, файл с ограниченным доступом, переменная окружения); при запуске playbook Ansible расшифровывает файл "на лету", получив пароль через --ask-vault-pass, --vault-password-file или интеграцию с внешним менеджером секретов. Пример кода Что использовать на практике Практика. распространённый паттерн — хранить обычные переменные в vars.yml, а секреты в vault.yml, зашифрованном Vault, и подключать оба файла; для разных окружений можно использовать разные vault-пароли (vault-id), чтобы доступ к prod-секретам был ограничен. Подводные камни Ошибка. закоммитить расшифрованный файл по ошибке из-за отсутствия pre-c
ansibleconfiguration-management