MiddleDevOps Engineer > Контейнеры и доставка > Процессы Linux
Короткий ответ Сначала проверяют, установлен ли в приложении обработчик SIGTERM и что именно он делает (возможно, зависает на внешнем вызове или ожидании соединения); если SIGTERM полностью игнорируется или обработчик завис, супервизор (systemd, оркестратор контейнеров) по истечении тайм-аута принудительно пришлёт SIGKILL. Как это работает подробнее SIGTERM, в отличие от SIGKILL, можно перехватить, заблокировать или проигнорировать на уровне приложения через sigaction(); если обработчик пытается, например, дождаться ответа от уже недоступной базы данных или завершить все активные соединения без тайм-аута, процесс может «зависнуть» в graceful shutdown бесконечно, пока его не остановят силой. Пример кода Что использовать на практике Практика. правильная graceful shutdown-логика должна иметь собственный внутренний тайм-аут (например, 10–30 секунд на дренаж соединений), после которого процесс завершает себя сам, не полагаясь только на внешний TimeoutStopSec в systemd или terminationGracePeriodSeconds в Kubernetes
graceful-shutdownlinux
JuniorPython Developer > Основы Python > Linux и процессы
Короткий ответ Нужно сначала посмотреть владельца, группу и права файла командой ls -l, узнать, под каким пользователем запущен процесс, а затем выдать минимально необходимые права через chmod/chown, а не открывать файл «всем на запись». Как это работает подробнее у каждого файла есть владелец, группа и биты прав rwx для владельца, группы и остальных; процесс читает файл с правами того UID, от имени которого он запущен — это может быть не тот пользователь, что создавал файл. Пример кода Что использовать на практике Рекомендация. ls -l config.yaml покажет владельца и права, ps -o user= -p <pid> покажет, от чьего имени работает процесс; дальше либо chown, либо chmod 640 (владелец читает/пишет, группа читает). Подводные камни Риск. «лечить» PermissionError через chmod 777 — даёт запись и чтение всем пользователям системы, включая потенциально скомпрометированные процессы, что является дырой безопасности для файлов с секретами.
chmoddiagnostics
MiddleDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ Нужно последовательно проверить: совпадают ли selector Service и labels подов, есть ли endpoints у сервиса (kubectl get endpoints), проходят ли поды readiness probe, совпадает ли targetPort с реальным портом, на котором слушает приложение внутри контейнера, и не блокирует ли трафик NetworkPolicy. Как это работает подробнее Service — это абстракция поверх реального списка endpoint, который формируется автоматически только при точном совпадении меток и успешном readiness; даже один неверный символ в значении метки или в имени порта полностью разрывает эту цепочку без явной ошибки в логах приложения — проблема проявляется только на уровне сетевого взаимодействия. Пример кода Что использовать на практике Практика. первый диагностический шаг — kubectl get endpoints : пустой список сразу сужает проблему до selector/labels/readiness, тогда как непустой список переключает фокус на targetPort, сетевые политики или на само приложение (слушает ли оно действительно указанный порт и интерфейс, напр
kubernetesnetworking
MiddleDevOps Engineer > Контейнеры и доставка > Ресурсы Linux
Короткий ответ Ошибка означает, что процесс исчерпал лимит на количество одновременно открытых файловых дескрипторов (soft limit ulimit -n); диагностируют через просмотр текущего лимита процесса (/proc/PID/limits) и количества реально открытых дескрипторов (lsof -p PID | wc -l или ls /proc/PID/fd | wc -l), после чего либо увеличивают лимит, либо устраняют утечку дескрипторов в приложении. Как это работает подробнее У каждого процесса есть soft- и hard-лимит на число открытых файловых дескрипторов, унаследованный от родительского процесса (shell, systemd, контейнерный рантайм) в момент запуска; если приложение открывает файлы/сокеты быстрее, чем закрывает (например, не закрывает соединения с клиентами или не освобождает файловые хендлы в цикле), оно рано или поздно упрётся в лимит независимо от того, насколько он большой. Пример кода Что использовать на практике Практика. нужно отличать две разные причины: заниженный системный/юнит-лимит для нормально работающего приложения (решается увеличением LimitNOFILE в
file-descriptorslinux
SeniorPython Developer > Основы Python > Архитектура веб-API
Короткий ответ Решение обычно строится вокруг централизованного секрет-хранилища (Vault, облачный Secrets Manager, Kubernetes Secrets с шифрованием) с доступом по принципу наименьших привилегий для каждого сервиса, автоматической или управляемой ротацией ключей и аудит-логом обращений; выбор конкретного инструмента зависит от инфраструктуры, бюджета и требований к compliance. Как это работает подробнее Централизованное хранилище секретов позволяет не хранить значения в коде/образах контейнеров/переменных окружения CI в открытом виде постоянно, выдавать сервисам короткоживущие токены доступа и централизованно ротировать скомпрометированный секрет без пересборки всех сервисов. Аудит-лог фиксирует, какой сервис/пользователь и когда обращался к конкретному секрету, что важно для расследования инцидентов. Полноценный секрет-менеджер с автоматической ротацией даёт наилучшую безопасность и аудит, но требует инвестиций в инфраструктуру и может усложнить локальную разработку/отладку; упрощённый подход через переменные
configurationenvironment-variables
JuniorPython Developer > Основы Python > SQL-запросы
Короткий ответ Запрос использует LEFT JOIN, но добавляет условие на колонку правой таблицы в WHERE, что фактически превращает его в INNER JOIN — автор хотел получить всех клиентов, включая тех без заказов, но получит только клиентов с хотя бы одним заказом на сумму больше 100. Как это работает подробнее Условие WHERE применяется после JOIN к объединённому набору строк; для клиента без заказов orders.amount будет NULL, а сравнение NULL > 100 даёт UNKNOWN, такая строка отбрасывается так же, как FALSE. Пример кода Что использовать на практике Практика. Чтобы сохранить семантику LEFT JOIN при фильтрации по правой таблице, условие на amount нужно переносить в сам ON, либо использовать (orders.amount > 100 OR orders.id IS NULL), в зависимости от того, что требуется получить. Подводные камни Ошибка. Эту ошибку часто не замечают в code review, потому что запрос синтаксически корректен и возвращает правдоподобные данные — проверять такие случаи нужно тестом с заведомо «пустым» клиентом.
postgresqlquerying
JuniorPython Developer > Основы Python > Декораторы и кэширование
Короткий ответ Без functools.wraps декорированная функция теряет собственные __name__ и __doc__, поэтому help() и обращение к метаданным покажут данные служебной функции wrapper, а не оригинальной функции greet. Как это работает подробнее Декоратор log_time оборачивает greet в wrapper и возвращает wrapper без копирования атрибутов; имя функции greet после декорирования фактически заменяется на wrapper, потому что greet = log_time(greet) присваивает переменной greet объект wrapper. Пример кода Что использовать на практике Практика. Это заметно при отладке (в traceback будет «wrapper», а не «greet»), при автогенерации документации по __doc__/__name__, а также при использовании интроспекции. Подводные камни Риски. Не замечают потерю метаданных, пока не начинают использовать инструменты, которые на них опираются (автогенерация OpenAPI-схем по именам и докстрингам хендлеров, профилировщики, группирующие вызовы по __name__).
cachingdecorators
JuniorData Analyst > SQL и данные > Аналитическое мышление
Короткий ответ Сравниваю текущий период не только с прошлой неделей, но и с тем же периодом предыдущего года/месяца и с динамикой похожих прошлых провалов (праздники, выходные), чтобы отличить повторяющийся паттерн от аномалии. Как это работает подробнее сравнение «неделя к неделе» чувствительно к календарным эффектам (праздники, начало/конец месяца, выходные дни). Нужно сопоставить с историческим паттерном за несколько периодов, а не с одной соседней неделей. Пример кода Что использовать на практике Порядок действий. строю график продаж за последние 1–2 года с разметкой праздников/акций; смотрю, было ли похожее падение в аналогичный период ранее (год к году); проверяю календарь — не выпала ли неделя на праздники или сокращённую рабочую неделю. Подводные камни Частые ошибки. сравнивать только с одной предыдущей неделей без учёта исторического контекста; не учитывать разное количество рабочих/выходных дней в сравниваемых периодах; сразу делать вывод о «проблеме», не исключив сезонность.
anomaly-detectionrevenue
MiddlePython Developer > Основы Python > Анализ требований
Короткий ответ Нужно явно выявить и зафиксировать противоречие, собрав всех заинтересованных сторон (или задав уточняющие вопросы письменно), и добиться одного согласованного и зафиксированного требования, прежде чем продолжать разработку. Как это работает подробнее Противоречивые требования почти всегда означают, что разные люди имеют в голове разные картины результата, и один из источников (или оба) ошибается или не в курсе деталей другого. Разработчик не должен выбирать между ними самостоятельно без согласования — это решение продукта, а не кода, и ошибочный выбор здесь обойдётся дороже любой технической недоработки. Пример кода Что использовать на практике Практика. Эффективный способ — задать конкретный вопрос с явными вариантами («фильтр должен показывать все 6 статусов заказа или только 3 клиентских статуса, скрывая внутренние?») и попросить зафиксировать ответ в тикете или связать с макетом. Если решить быстро нельзя, стоит реализовать ту часть, которая не зависит от спорного вопроса, не блокируя всю
acceptance-criteriaproduct-management
MiddleData Analyst > Метрики и эксперименты > A/B-тесты
Короткий ответ Ежедневная проверка с остановкой по первому значимому результату (peeking) резко завышает фактическую вероятность ложноположительного вывода по сравнению с заявленным alpha. Вместо этого нужно либо держать фиксированный горизонт теста (fixed-horizon), либо заранее использовать методологию, рассчитанную на повторные проверки — sequential testing / alpha spending (например, O'Brien-Fleming) или always-valid p-values. Как это работает подробнее при fixed-horizon alpha гарантированно контролируется только для одной финальной проверки на заранее определённом объёме выборки; при sequential-дизайне порог значимости на каждой промежуточной проверке корректируется так, чтобы суммарная вероятность ложного срабатывания за всё время теста не превышала общую alpha. Компромиссное предложение: зафиксировать заранее рассчитанную длительность (например, 14 дней на основе расчёта размера выборки) для принятия решения, при этом разрешить ежедневный мониторинг guardrail-метрик (крэши, ошибки оплаты) с правом экстр
alpha-spendingfixed-horizon