MiddleData Analyst > SQL и данные > SQL
Короткий ответ Нужно пронумеровать дубликаты внутри каждой группы бизнес-ключа функцией ROW_NUMBER() OVER (PARTITION BY business_key ORDER BY updated_at DESC) и оставить (или удалить все, кроме) строки с номером 1. Как это работает подробнее PARTITION BY business_key делит строки на группы дублей, ORDER BY updated_at DESC внутри каждой группы ставит самую свежую запись первой, и ROW_NUMBER() присваивает ей номер 1; все остальные строки группы получают номера 2, 3 и так далее и считаются «лишними» дублями. Пример кода Что использовать на практике в PostgreSQL для реального удаления обычно оборачивают это в CTE и используют DELETE ... WHERE id IN (SELECT id FROM ranked WHERE rn > 1); важно сначала выполнить только SELECT, чтобы визуально проверить, какие строки будут удалены, прежде чем запускать DELETE. В ClickHouse для таблиц с движком ReplacingMergeTree похожая задача решается через FINAL или OPTIMIZE ... DEDUPLICATE, что работает принципиально иначе. Проверка: количество строк с rn = 1 должно равняться COUN
data-cleaningdeduplication
SeniorPython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ FastAPI поддерживает асинхронную обработку запросов через ключевые слова async и await. Эндпоинт, объявленный как async def, становится корутиной, которую можно приостанавливать, освобождая ресурсы для других задач, а обычные def-эндпоинты FastAPI выполняет в пуле потоков. Как это работает подробнее Асинхронность позволяет конкурентно обрабатывать запросы и эффективнее использовать ресурсы. Корутины. async def превращает функцию пути в корутину, которую можно приостанавливать и возобновлять. Переключение задач. При вызове await выполнение возвращается циклу событий, и время ожидания сети или диска используется для других запросов. Масштабирование. Неблокирующий ввод-вывод позволяет обслуживать больше запросов меньшим числом ресурсов. Простота. Асинхронный код избавляет от ада колбэков и сложностей многопоточности. Синхронные эндпоинты. Быстрые def-функции FastAPI запускает в пуле потоков, не блокируя цикл событий. Пример кода Что использовать на практике Типичные сценарии. Применяй async в серв
asyncawait
MiddleDevOps Engineer > Контейнеры и доставка > Ресурсы и выполнение
Короткий ответ Лимит --cpus транслируется в cgroup-параметры CFS-квоты (cpu.cfs_quota_us/cpu.cfs_period_us в cgroup v1 или cpu.max в cgroup v2); превышение квоты за период не убивает процесс, а принудительно приостанавливает его (throttling) до следующего периода, что видно по росту счётчика nr_throttled в cpu.stat. Как это работает подробнее CFS (Completely Fair Scheduler) делит время на периоды (обычно 100ms) и выделяет контейнеру квоту CPU-времени внутри каждого периода пропорционально лимиту (например, --cpus=0.5 даёт квоту в половину периода). Если контейнер исчерпал квоту раньше конца периода, ядро приостанавливает (throttle) его потоки до начала следующего периода — приложение не падает, но ощутимо замедляется, даже если на хосте формально есть свободные ядра. Пример кода Что использовать на практике Практика. throttling диагностируют через cpu.stat соответствующей cgroup контейнера: растущий nr_throttled относительно nr_periods и накопленный throttled_time указывают на то, что лимит CPU слишком жёстки
cgroupscontainers
JuniorPython Developer > Основы Python > Реляционная модель данных
Короткий ответ NULL обозначает отсутствие значения, а не конкретное значение, поэтому любое сравнение с NULL через =, !=, возвращает NULL (не true/false), и строка не попадает в результат WHERE; проверять нужно через IS NULL / IS NOT NULL. Как это работает подробнее SQL использует трёхзначную логику (TRUE/FALSE/UNKNOWN); WHERE оставляет только строки, где условие дало TRUE, а UNKNOWN отбрасывается так же, как FALSE. Агрегатные функции COUNT(column), SUM, AVG игнорируют NULL-значения. Пример кода Что использовать на практике Практика. Для замены NULL на значение по умолчанию используют COALESCE(column, 'default'); для подсчёта всех строк включая NULL используют COUNT(*), а не COUNT(column). Подводные камни Ошибка. Пишут WHERE column = NULL вместо WHERE column IS NULL и получают пустой результат без ошибки; не учитывают, что NOT IN с подзапросом, содержащим NULL, возвращает пустой результат для всех строк.
constraintsdata-modeling
JuniorDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ Pod попадает в endpoints Service, когда его метки совпадают с selector сервиса и его readiness probe (если она задана) проходит успешно; если readiness не настроена, под считается готовым сразу после того, как все контейнеры перешли в состояние Running. Как это работает подробнее контроллер Endpoints (или EndpointSlice-контроллер в новых версиях) постоянно следит за подами, подходящими под selector Service, и добавляет в список только те, у которых статус Ready в условиях (Conditions) Pod равен True. kube-proxy на каждом узле обновляет правила маршрутизации на основе этого списка. Пример кода Что использовать на практике Практика. это механизм, который позволяет безопасно выкатывать обновления — новый под не получает трафик, пока не пройдёт readiness, а под, который перестал отвечать на readiness во время работы (например, временная перегрузка), автоматически и временно исключается из балансировки без перезапуска. Подводные камни Риски. не задавать readiness probe вовсе, из-за чего трафик может
kubernetesnetworking
MiddlePython Developer > Основы Python > Многопоточность и асинхронность
Короткий ответ Модуль threading предоставляет класс Thread: поток создаётся вокруг callable-объекта, запускается методом start() и ожидается через join(). Из-за GIL в каждый момент исполняется один поток, поэтому многопоточность эффективна прежде всего для задач ввода-вывода. Как это работает подробнее Потоками управляет операционная система, но CPython через GIL ограничивает одновременное исполнение Python-байткода одним потоком. Глобальная блокировка. Для CPU-bound задач потоки не дают ускорения: остальные потоки ждут освобождения GIL. Ожидание ввода-вывода. Пока поток ждёт ответа от сети, диска или базы данных, GIL свободен, и другие потоки выполняют код. Синхронизация. При изменении общих данных возникают состояния гонки, поэтому используют блокировки Lock и семафоры Semaphore. Безопасная передача данных. Для обмена данными между потоками удобно использовать queue.Queue. Настоящий параллелизм. Чтобы задействовать несколько ядер процессора, применяют multiprocessing или библиотеки вроде joblib, запускающие
concurrencygil
MiddlePython Developer > Основы Python > ООП и модель объектов
Короткий ответ Для объектов без циклов CPython освобождает память сразу, когда счётчик ссылок (refcount) падает до нуля; для объектов, образующих цикл ссылок друг на друга, счётчик ссылок никогда не достигнет нуля сам по себе, поэтому отдельный циклический сборщик мусора (generational garbage collector) периодически находит такие группы объектов и освобождает их — а weakref позволяет держать ссылку на объект, не увеличивая его refcount и не создавая цикл, который мешал бы освобождению памяти. Как это работает подробнее Каждый объект в CPython хранит счётчик ссылок; когда он достигает нуля, память освобождается немедленно, детерминированно. Если объект A ссылается на B, а B ссылается на A, их взаимные ссылки держат refcount каждого минимум на 1, даже если снаружи на них больше никто не ссылается — обычный refcounting эту группу никогда не освободит. Модуль gc периодически запускает алгоритм поиска таких недостижимых извне циклов и освобождает их; weakref.ref(obj) создаёт ссылку, которая не увеличивает refcount
garbage-collectionobject-model
SeniorDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ Единого "правильного" порога probe и PDB не существует — их нужно настраивать исходя из конкретного SLO сервиса (например, допустимой доли ошибок за период) и бюджета ошибок: слишком агрессивные probe увеличивают число ложных исключений из трафика и расходуют error budget на ровном месте, а слишком мягкие probe/PDB позволяют реальным сбоям дольше оставаться незамеченными или допускают избыточные одновременные добровольные нарушения доступности. Как это работает подробнее каждое срабатывание readiness-провала временно убирает под из трафика, что при недостаточном числе оставшихся готовых реплик может повысить нагрузку на них и увеличить латентность или долю ошибок — то есть сами механизмы защиты (probe) при неверной настройке могут стать источником нарушения SLO, а не только средством его защиты. PodDisruptionBudget ограничивает, сколько реплик может быть недоступно одновременно из-за плановых операций (апгрейд узлов, автоскейлинг вниз), что напрямую связано с тем, сколько "бюджета" доступности
availabilitydisruptions
SeniorPerformance Marketer > Google Ads > Устойчивость результатов и управление рисками
Короткий ответ Допустимую волатильность совместно определяют маркетинг, финансы и руководство: решение зависит от запаса прочности и приоритета между быстрым ростом и стабильной экономикой. Как это работает подробнее Риск-толерантность задаётся конкретными пределами, например временным ростом CPA до согласованного уровня и максимальной продолжительностью такого периода. Условия отката и ответственные должны быть определены до масштабирования. Что использовать на практике До роста бюджета согласуйте допустимое отклонение CPA, его срок и условие паузы или отката. Зафиксируйте, кто принимает решение об остановке и какой денежный резерв доступен. Представьте бизнесу последствия быстрого и медленного сценариев, не выбирая стратегию единолично. Подводные камни Не определяйте риск-толерантность постфактум или без числовых порогов: это ведёт к непоследовательным решениям и конфликтам. Высокая терпимость требует финансового буфера; низкая может замедлить рост и уступить возможности конкурентам.
budget-scalingcash-reserve
JuniorSMM Manager > Общее > Брендбук и Tone of Voice
Короткий ответ Нужно воспринимать ToV как профессиональный инструмент, а не личное писательское самовыражение: тренироваться писать в заданном стиле через разбор примеров и обратную связь, и обсуждать с редактором конкретные формулировки, которые даются особенно тяжело, а не менять стиль бренда под себя. Как это работает подробнее работа SMM-менеджера подразумевает написание текстов от имени бренда, а не от своего имени, поэтому личные стилистические предпочтения вторичны по отношению к задаче бренда. Что использовать на практике Подход. помогает практика «перевода» своих естественных формулировок в формулировки бренда — сначала написать как привычно, затем осознанно переписать в соответствии с ToV, сравнивая с примерами. Пример. Копирайтер, привыкший писать развёрнуто и с иронией, работает с брендом, где принят короткий и прямой стиль без шуток. На этапе обучения редактор сокращает и выпрямляет 5 черновиков подряд, показывая принцип; через несколько итераций копирайтер самостоятельно пишет черновики, требующ
brand-guidelinesbrand-management