MiddleDevOps Engineer > Контейнеры и доставка > Скриптинг и автоматизация
Короткий ответ Экспоненциальная задержка увеличивает интервал между попытками по формуле вида base * 2^attempt, а джиттер добавляет случайное отклонение, чтобы множество клиентов не повторяли запрос синхронно в одну и ту же миллисекунду; retry storm возникает, когда много клиентов одновременно и неограниченно ретраят падающий сервис, усиливая нагрузку на него вместо того, чтобы дать ему восстановиться. Как это работает подробнее без джиттера все клиенты, упавшие в один момент (например, из-за кратковременного рестарта сервиса), отправят повторный запрос ровно через одинаковый интервал, создавая синхронные "волны" нагрузки; добавление случайной компоненты размазывает повторные запросы во времени. Пример кода Что использовать на практике Рекомендация. нужно ограничивать не только число попыток, но и типы ошибок, которые ретраятся — имеет смысл повторять на таймаутах, 502/503/429 и сетевых сбоях, но не на 400/401/403/404, так как повтор того же некорректного запроса ничего не изменит. При получении 429 или 503 с
backoffjitter
JuniorPython Developer > Основы Python > Тестирование кода
Короткий ответ Декоратор @pytest.mark.parametrize позволяет один раз описать тело теста и список пар (входные данные, ожидаемый результат), и pytest запустит тест отдельно для каждого набора. Как это работает подробнее В decorator передаются имена параметров строкой и список кортежей со значениями; pytest на их основе генерирует отдельный тест-кейс для каждой комбинации данных, видимый в отчёте как отдельный пункт. При падении одного набора остальные продолжают выполняться независимо, не блокируя проверку других значений. Пример кода Что использовать на практике Практика. Параметризация особенно полезна для граничных значений и edge cases: пустая строка, отрицательное число, None, очень большое значение, которые иначе пришлось бы дублировать в отдельных функциях. Каждому кейсу можно задать понятный id через параметр ids, чтобы в отчёте CI сразу было видно, какой именно набор данных упал, не читая тело теста. Подводные камни Риск. Запихивать в один параметризованный тест слишком разные сценарии с разной логико
parametrizationpytest
MiddleData Analyst > SQL и данные > Качество данных
Короткий ответ Нужно сгенерировать полный календарь дат за нужный период (через generate_series в PostgreSQL или аналог в другом диалекте) и сделать LEFT JOIN к фактической таблице метрики — даты без соответствия и будут пропущенными днями. Как это работает подробнее Если в таблице просто нет строки за какой-то день (а не строка со значением 0), обычный SELECT DISTINCT date FROM table этот пропуск не покажет — нужен «эталонный» список всех ожидаемых дат, с которым можно сравнить. Пример кода Что использовать на практике На практике. Такую проверку стоит включать в мониторинг качества данных для любых ежедневных витрин — пропущенный день гораздо легче не заметить, чем аномальное значение, потому что на графике линия просто «перескакивает» через дыру, если инструмент визуализации не акцентирует на этом внимание. Проверка. если запрос вернул даты — нужно проверить логи пайплайна за эти дни на предмет сбоя загрузки, прежде чем интерпретировать их как «нулевую активность». Подводные камни Частые ошибки. Путают «де
data-qualitygenerate-series
JuniorDevOps Engineer > Контейнеры и доставка > Мониторинг, логирование и observability
Короткий ответ Prometheus хранит временные ряды метрик и умеет их агрегировать через PromQL; Grafana — это инструмент визуализации, который сам метрики не хранит, а подключается к Prometheus (и другим источникам: Loki, Elasticsearch, базам данных) как к data source и строит дашборды из результатов запросов. Как это работает подробнее в Grafana создаётся "Data source" с адресом Prometheus-сервера; дальше каждая панель дашборда содержит PromQL-запрос, который Grafana отправляет в Prometheus по HTTP при каждом обновлении экрана и отображает результат как график, число, таблицу и т.д. Пример кода Что использовать на практике Практика. один дашборд Grafana может одновременно показывать панели из разных источников — например, метрики из Prometheus и логи из Loki на одном экране, что удобно для корреляции во время инцидента. Grafana также поддерживает Alerting поверх тех же запросов, но управление алертами на основе Prometheus обычно удобнее вести через правила самого Prometheus и Alertmanager. Практика. После добав
grafanamonitoring
JuniorSMM Manager > Общее > Контент и форматы
Короткий ответ Нужно заранее определить 1–2 продающих, 1–2 образовательных, 1–2 развлекательных поста и, если возможно, один UGC на неделю, расписав для каждого цель, формат и дату — соотношение зависит от бизнеса и сезона, а не фиксировано навсегда. Как это работает подробнее контент-план — это таблица или календарь с датой, темой, типом контента, форматом (фото/видео/карусель) и статусом подготовки; заполнение идёт от бизнес-целей недели (например, анонс акции), а не от случайных идей. Что использовать на практике Рекомендация. на старте удобно взять шаблон 1 продающий / 2 образовательных / 2 развлекательных / 1 UGC в неделю и корректировать по факту вовлечённости и бизнес-календаря (праздники, акции, инфоповоды). Подводные камни Риск. ставить все продающие посты подряд без «буфера» другого контента; планировать контент-план без привязки к реальным датам акций и доступности материалов; не оставлять запас времени на подготовку макетов у дизайнера.
carouselcontent-planning
MiddlePython Developer > Основы Python > Миграции базы данных
Короткий ответ Миграцию обычно разбивают на несколько независимых, обратно совместимых шагов, каждый из которых можно выкатить и при необходимости откатить отдельно, не требуя одновременной остановки приложения и базы. Как это работает подробнее Классический подход — expand/contract: сначала добавляют новую колонку как необязательную (expand), выкатывают код, который пишет в оба места (старое и новое) или постепенно переключается на новое, затем переносят/бэкфилят исторические данные, и только после полного перехода удаляют старую колонку или делают новую обязательной (contract). Между шагами приложение всегда работает с совместимой схемой, а не ждёт единомоментного переключения. Пример кода Что использовать на практике Практика. Важно учитывать порядок выката: код должен уметь работать как со старой, так и с новой схемой во время переходного периода, потому что при деплое на несколько инстансов какое-то время одновременно работают старая и новая версии кода. Бэкфилл больших таблиц стоит делать батчами в фоне
backfilldatabase
MiddlePerformance Marketer > Google Ads > Сквозная аналитика и отчётность
Короткий ответ Нужно определить общие ключи соединения данных (дата, канал/кампания через UTM), выбрать инструмент агрегации (таблицы, BI-система, склад данных) и зафиксировать единый набор метрик и период обновления. Как это работает подробнее Данные выгружаются из каждого источника через API или встроенные коннекторы в промежуточное хранилище (таблица, Google Sheets, BigQuery), где приводятся к единой структуре (дата, канал, кампания, расход, клики, конверсии), а затем визуализируются в BI-инструменте. При росте числа источников стоит заранее предусмотреть обработку новых полей и каналов в схеме, чтобы добавление, например, TikTok Ads не требовало полной переработки структуры таблиц. Пример кода Что использовать на практике Практика. На практике важно заранее договориться о единых названиях кампаний/каналов между платформами (или таблице соответствия) и о частоте обновления данных, иначе дашборд будет показывать устаревшие или несопоставимые цифры. Для дашборда стоит заложить обновление данных не реже одног
dashboardsdata-warehouse
MiddleSMM Manager > Общее > Контент-стратегия
Короткий ответ Для каждого этапа воронки выбирают метрику, которая отражает именно его задачу: на awareness — охват и показы уникальным пользователям, на engagement — ER, сохранения, комментарии, на conversion — переходы по ссылке, использование промокода, заявки; единая метрика на всю воронку не показывает, где реально есть проблема. Как это работает подробнее привязка KPI к этапу позволяет диагностировать, на каком именно шаге аудитория «теряется» — например, высокий охват, но низкая вовлечённость указывает на проблему именно на этапе engagement. Что использовать на практике На практике. KPI по этапам сводят в единый отчёт по воронке, что позволяет сравнивать периоды и видеть, какой этап нужно усиливать контентом или бюджетом. Пример. Отчёт за месяц: awareness — охват 50 000 (+10%), engagement — ER 4,2% (было 3,8%), conversion — 120 переходов по промокоду (было 90). Проверка: рост показателя на каждом этапе сверяется отдельно, а не усредняется в одну общую метрику. Подводные камни Частые ошибки. использоват
content-analyticscontent-funnel
MiddleData Analyst > SQL и данные > Продуктовые и бизнес-метрики
Короткий ответ Хороший продуктовый дашборд должен строиться вокруг иерархии: North Star Metric наверху, input-метрики (драйверы), на которые команда может влиять, и guardrail-метрики, предупреждающие о побочном вреде — а не представлять собой произвольный набор десятков несвязанных графиков. Как это работает подробнее иерархическая структура позволяет быстро понять, "что происходит в целом" (NSM), "почему это происходит" (input-метрики) и "не ломаем ли мы что-то ещё" (guardrails); каждая метрика на дашборде должна иметь чёткое, задокументированное определение (окно, фильтры, таймзона), одинаковое для всех потребителей. Структура дашборда для B2C-приложения: Такая структура позволяет менеджеру за 30 секунд понять общее состояние продукта и куда смотреть при отклонениях. Что использовать на практике Практика. стоит ограничивать число метрик на главном экране (5-10), выносить детализацию в drill-down; обязательно фиксировать на дашборде момент последнего обновления данных и источник, чтобы избежать путаницы при
dashboarddata-visualization
MiddlePython Developer > Основы Python > FastAPI и Pydantic
Короткий ответ FastAPI по умолчанию кэширует результат зависимости в пределах одного запроса по идентичности callable, поэтому при использовании одной и той же функции-зависимости в нескольких местах она вызывается один раз; поведение можно явно отключить через use_cache=False. Как это работает подробнее Внутри одного запроса FastAPI строит граф зависимостей и для каждого уникального callable (с одинаковыми параметрами вызова) хранит результат в локальном кэше запроса. Если два разных эндпоинта или две разные зависимости ссылаются на Depends(get_db), функция get_db выполнится один раз, а не дважды. Пример кода Что использовать на практике Практика. Это полезно для подключения к БД, кэша текущего пользователя, открытия транзакции — важно, чтобы разные части кода работали с одним и тем же объектом сессии в рамках запроса. Если нужно гарантированно вызвать зависимость повторно (например, для генерации нового значения), используют Depends(func, use_cache=False). Подводные камни Риск. Создают несколько разных функ
cachingdependency-injection