JuniorDevOps Engineer > Контейнеры и доставка > Мониторинг, логирование и observability
Короткий ответ Health check — это специальный HTTP-эндпоинт (например, /healthz или /livez), который приложение отдаёт для простой проверки "жив ли процесс и может ли он обслуживать запросы"; системы мониторинга и оркестрации периодически опрашивают его и на основе ответа решают, считать сервис рабочим или перезапускать/выводить из балансировки. Как это работает подробнее эндпоинт обычно возвращает 200 OK, если внутренние проверки (доступность процесса, иногда — базовых зависимостей) прошли успешно, и ошибку или таймаут — если нет. Внешний мониторинг (blackbox_exporter, Kubernetes liveness probe) регулярно дёргает этот эндпоинт и на основе серии неудачных ответов принимает решение — поднять алерт или перезапустить контейнер. Пример кода Что использовать на практике Практика. важно разделять "простой" health check (процесс отвечает) и "глубокую" проверку (база данных доступна, кеш доступен) — слишком тяжёлая проверка в liveness может привести к каскадным перезапускам, если временно недоступна внешняя зависимос
health-checksmonitoring
JuniorPython Developer > Основы Python > Надёжность сервисов
Короткий ответ Health check — отдельный эндпоинт (например /health), который сообщает, жив ли сервис и готов ли принимать трафик; используется балансировщиком и оркестратором для роутинга и перезапуска. Как это работает подробнее Оркестратор периодически опрашивает эндпоинт; если ответ не 200 OK — инстанс исключается из балансировки (readiness) или перезапускается (liveness). Пример кода Что использовать на практике Практика. Различают liveness (процесс жив) и readiness (готов обслуживать запросы, например БД доступна); readiness часто проверяет критичные зависимости. Подводные камни Риск. Делать health check тяжёлым (полный прогон бизнес-логики); не разделять liveness и readiness, из-за чего временная недоступность внешней зависимости приводит к перезапуску здорового процесса.
fault-tolerancehealth-checks
JuniorPython Developer > Основы Python > HTTP-семантика
Короткий ответ Keep-alive позволяет повторно использовать одно и то же TCP-соединение для нескольких HTTP-запросов подряд, избегая накладных расходов на установку нового соединения (и TLS-хендшейка) для каждого запроса. Как это работает подробнее в HTTP/1.1 keep-alive включён по умолчанию (в отличие от HTTP/1.0), соединение остаётся открытым после ответа, пока клиент или сервер не закроют его явно (заголовком Connection: close) или по таймауту неактивности. Пример кода Что использовать на практике Рекомендация. при множестве вызовов к одному и тому же внешнему сервису стоит использовать переиспользуемую сессию клиента (например, requests.Session() или пул соединений в httpx/aiohttp), а не создавать новое соединение на каждый запрос — это заметно снижает латентность при частых вызовах. Подводные камни Риски. создавать новый requests.Session() или новое TCP-соединение на каждый вызов функции, обрабатывающей запрос, что увеличивает нагрузку и задержку при частых обращениях к внешнему API; не закрывать сессии/пул
connection-poolinghttp
JuniorDevOps Engineer > Контейнеры и доставка > Infrastructure as Code и управление конфигурацией
Короткий ответ Inventory — это файл (INI или YAML), в котором перечислены управляемые хосты и их группировка, используемая для нацеливания playbook на нужный набор серверов; в простом варианте это статический список IP/имён, сгруппированных по заголовкам секций. Как это работает подробнее Ansible читает inventory и строит внутреннее представление хостов и групп с переменными (host_vars/group_vars); playbook указывает целевую группу в поле hosts:, и Ansible подключается к каждому хосту из неё по SSH (или WinRM) для выполнения задач. Пример кода Что использовать на практике Практика. статический inventory подходит для небольших и стабильных окружений; группы можно вкладывать друг в друга ([prod:children]), а переменные, общие для группы, выносить в group_vars/.yml, чтобы не повторять их в playbook. Подводные камни Ошибка. хранить пароли или ключи прямо в inventory в открытом виде; забывать, что имя хоста в inventory должно быть разрешаемым (DNS/hosts-файл), или явно не указывать ansible_host с IP-ад
ansibleconfiguration-management
MiddlePython Developer > Основы Python > Базы данных и SQL
Короткий ответ JOIN — ключевое слово SQL для выборки данных из нескольких таблиц на основе связи между их полями: записи объединяются по связанному столбцу. INNER JOIN возвращает только строки с совпадениями в обеих таблицах. LEFT JOIN — все строки левой таблицы и совпавшие строки правой, RIGHT JOIN — симметрично, а FULL JOIN — все строки обеих таблиц. Как это работает подробнее Типы JOIN отличаются тем, что происходит со строками, у которых нет пары в другой таблице. INNER JOIN. Самый часто используемый тип: если в одной из таблиц нет подходящей строки, запись в результат не попадает. LEFT OUTER JOIN. Возвращает все записи левой таблицы; если пары в правой нет, её поля заполняются NULL. RIGHT OUTER JOIN. Работает симметрично: все строки правой таблицы и только совпавшие строки левой. FULL OUTER JOIN. Возвращает строки при совпадении в любой из таблиц: все строки левой и правой с NULL на месте отсутствующих совпадений. Специальные виды. CROSS JOIN даёт декартово произведение строк, а SELF-JOIN соединяет табли
inner-joinjoin
JuniorDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ kubeconfig — это файл с данными для подключения к одному или нескольким кластерам (адрес API сервера, учётные данные, сертификаты), а контекст внутри него — именованная комбинация "кластер + пользователь + namespace по умолчанию"; переключение контекста определяет, к какому кластеру и под каким пользователем будут выполняться команды kubectl. Как это работает подробнее по умолчанию kubectl читает файл ~/.kube/config (или путь из переменной KUBECONFIG), который может содержать несколько записей clusters, users и contexts; активный контекст (current-context) определяет, какая комбинация используется при выполнении команд без явного указания --context. Пример кода Что использовать на практике Практика. при работе с несколькими кластерами (например, dev и prod) критично перед выполнением потенциально опасной команды проверять текущий контекст (kubectl config current-context), чтобы случайно не применить изменения не в том окружении. Для автоматизации (CI/CD) обычно используют отдельный ServiceAccou
authenticationkubeconfig
JuniorDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ Labels — это произвольные пары ключ-значение, прикреплённые к объектам (например, app: web), а selector — это запрос, который по значениям labels выбирает набор объектов; через эту связь Service находит свои Pod, а Deployment — управляемые им Pod. Как это работает подробнее labels не имеют встроенного смысла для Kubernetes — это просто метаданные, которые становятся значимыми только тогда, когда другой объект ссылается на них через selector. Selector поддерживает равенство (app=web) и наборные выражения (in, notin, exists) для более гибкой фильтрации. Пример кода Что использовать на практике Практика. labels используют для группировки по приложению, окружению, версии (app, tier, env, version), а selectors Service/Deployment/NetworkPolicy опираются именно на них для определения "своих" подов. Хорошая схема меток с самого начала экономит время на диагностике и позволяет гибко фильтровать ресурсы командой kubectl get pods -l. Подводные камни Риски. менять labels у уже запущенных Pod, управляемых D
containerskubernetes
MiddlePython Developer > Основы Python > Функции и области видимости
Короткий ответ map(), filter() и reduce() — функции для функциональной обработки коллекций. map() применяет функцию к каждому элементу, filter() отбирает элементы по заданному условию, а reduce() последовательно сводит коллекцию к одному итоговому значению. Как это работает подробнее В Python 3 map() и filter() возвращают итераторы, поэтому результат обычно оборачивают в list(), а reduce() вынесена в модуль functools. Преобразование. map(func, iterable) вызывает функцию для каждого элемента и возвращает итератор с результатами; в качестве функции часто передают лямбду. Фильтрация. filter(predicate, iterable) оставляет только те элементы, для которых функция-предикат вернула истину. Свёртка. reduce(func, iterable) из модуля functools последовательно комбинирует элементы — например, суммирует их или находит максимум за один проход. Ленивость. Итераторы, возвращаемые map() и filter(), вычисляются по требованию, что экономит память при обработке больших последовательностей. Пример кода Что использовать на практик
filterfunctional-programming
JuniorData Analyst > Метрики и эксперименты > A/B-тесты
Короткий ответ MDE — это минимальный размер эффекта, который тест способен достоверно обнаружить при заданных размере выборки, мощности и alpha. Его определяют до теста, чтобы заранее понять, сколько трафика и времени нужно, и не разочароваться, что тест «не нашёл» эффект, который был меньше MDE. Как это работает подробнее MDE и размер выборки связаны обратной зависимостью: чем меньше эффект нужно обнаружить, тем больше пользователей требуется; MDE обычно выражают в абсолютных пунктах или в процентах относительно базовой метрики. Пример: при трафике 10 000 пользователей на группу в месяц и базовой конверсии 5% MDE при мощности 80% и alpha 0.05 может составлять около 1.2 п.п. Если ожидаемый эффект изменения — 0.3 п.п., тест в текущем виде не сможет его надёжно обнаружить, и нужно либо увеличить выборку, либо длительность. Что использовать на практике MDE выбирают так, чтобы он был не меньше минимального эффекта, который имеет практическую ценность для бизнеса — нет смысла гнаться за точностью обнаружения эффек
mdemoschnost
JuniorPython Developer > Основы Python > Проектирование API
Короткий ответ Middleware — это слой кода, который выполняется для каждого (или группы) HTTP-запроса до и/или после основного обработчика; его используют для сквозной функциональности — логирования, аутентификации, CORS, обработки ошибок, замера времени запроса. Как это работает подробнее запрос проходит цепочку middleware по порядку их регистрации перед тем, как попасть в обработчик маршрута, а ответ проходит ту же цепочку в обратном порядке — так middleware может модифицировать и запрос, и ответ. Пример кода Что использовать на практике Рекомендация. middleware удобно для логики, общей для всех (или многих) эндпоинтов — не нужно дублировать код проверки токена или логирования в каждом обработчике отдельно. Но не всякая сквозная логика должна быть middleware — если проверка специфична для конкретного эндпоинта (например, доступ к конкретному ресурсу), лучше использовать dependency/декоратор на уровне обработчика. Подводные камни Риски. помещать в middleware тяжёлую бизнес-логику, которая должна зависеть от п
cross-cutting-concernsmiddleware