MiddleDevOps Engineer > Контейнеры и доставка > Маршрутизация
Короткий ответ Нужно проверить таблицу маршрутизации командой ip route и убедиться, что есть маршрут (явный или через default gateway) до целевой подсети, а также проверить, что шлюз, через который должен идти трафик, сам знает маршрут до назначения и не блокирует трафик правилами файрвола. Как это работает подробнее Каждый пакет, отправляемый на адрес вне локальной подсети, ядро направляет согласно таблице маршрутизации, выбирая наиболее специфичный подходящий маршрут (longest prefix match); если подходящего маршрута нет и нет default gateway (0.0.0.0/0), пакет не будет отправлен вообще; если маршрут до шлюза есть, но сам шлюз не имеет обратного маршрута к отправителю или блокирует трафик, пакеты уходят, но ответы не возвращаются, что выглядит как зависшее соединение, а не явная ошибка. Пример кода Что использовать на практике Практика. диагностику ведут пошагово: ip route get покажет, какой маршрут и интерфейс ядро выберет для конкретного адреса; traceroute покажет, где именно трафик перестаёт продвигаться;
ipnetworking
SeniorPython Developer > Основы Python > FastAPI и Pydantic
Короткий ответ Варианты — версионирование API (новый путь/заголовок версии), поддержка старого и нового формата одновременно через дополнительные поля с периодом параллельной поддержки, либо строгая политика deprecation с заранее объявленным сроком отключения старого контракта; выбор зависит от того, кто клиенты, насколько они управляемы и насколько критична обратная совместимость. Как это работает подробнее Явное версионирование (/v2/... или заголовок) позволяет годами поддерживать старые клиенты параллельно с новыми, но увеличивает поверхность поддержки кода. Расширение контракта (добавление нового поля рядом со старым, двойная запись в оба поля) позволяет клиентам мигрировать поэтапно без немедленной жёсткой поломки, но временно усложняет схему данных и сериализацию. Жёсткое версионирование даёт предсказуемость для внешних клиентов, но дорого в поддержке нескольких параллельных версий логики и тестов; расширение контракта без версии дешевле в моменте, но увеличивает сложность схемы и риск, что часть клиент
api-versioningfastapi
SeniorPython Developer > Основы Python > Транзакции и конкурентность
Короткий ответ Идемпотентность достигается явным uniqueness-ограничением на идентификатор операции (idempotency key/event id) в таблице, где фиксируется факт обработки, в сочетании с атомарной записью результата и факта обработки в одной транзакции — повторная обработка того же события натыкается на уже существующую запись и безопасно пропускается вместо повторного выполнения эффекта. Как это работает подробнее Перед выполнением бизнес-эффекта приложение пытается вставить строку с уникальным event_id в таблицу processed_events в той же транзакции, где выполняется сам эффект; если вставка нарушает unique-ограничение — событие уже обработано, транзакция откатывается без повторного эффекта. Сравнение Компромисс. Хранение полной истории обработанных event_id бессрочно требует места и обслуживания (архивация/партиционирование), а слишком агрессивная очистка рискует «забыть» о событии при очень отложенном ретрае брокера; критерий выбора срока хранения — максимально возможная задержка повторной доставки в конкретном
concurrencypostgresql
SeniorPython Developer > Основы Python > Безопасность API и сети
Короткий ответ Грубую фильтрацию по объёму и известным паттернам эффективнее останавливать как можно раньше — на уровне CDN/WAF/API-gateway, до того как запрос дойдёт до бизнес-логики, а содержательные решения, зависящие от состояния аккаунта и бизнес-правил, остаются на уровне приложения, где доступен весь нужный контекст. Как это работает подробнее CDN/WAF фильтрует трафик до того, как он потребляет ресурсы серверов приложения, что особенно важно при объёмных атаках, где цель — исчерпать инфраструктуру; но эти слои обычно не видят бизнес-контекст (например, что конкретный аккаунт за последний час создал 500 бесплатных пробных подписок), поэтому такие проверки естественно живут в коде приложения. Компромисс. Фильтрация на периметре (CDN/WAF/gateway) дешевле по стоимости обработки и быстрее останавливает объёмные атаки, но ограничена в точности без бизнес-контекста и может случайно блокировать легитимных пользователей за общими IP; защита на уровне приложения точнее, но требует, чтобы трафик вообще дошёл до н
abuse-preventionapi-gateway
MiddlePython Developer > Основы Python > Linux и процессы
Короткий ответ Причину смотрят через journalctl -u <service> --since "1 hour ago" и systemctl status <service>; чтобы не попасть в бесконечный restart loop, настраивают Restart=on-failure вместе с StartLimitBurst/StartLimitIntervalSec, которые останавливают попытки после N неудач за интервал. Как это работает подробнее systemd запускает процесс как дочерний и следит за его завершением; Restart=on-failure перезапускает только при ненулевом коде выхода, StartLimitIntervalSec/StartLimitBurst переводят unit в failed после слишком частых перезапусков. Пример кода Что использовать на практике Рекомендация. journalctl -u myapp -n 200 --no-pager покажет traceback падения; частые перезапуски могут быть вызваны OOM (dmesg | grep -i oom), необработанным исключением при старте или недоступной зависимостью при старте. Подводные камни Риск. Restart=always без лимитов — при системной проблеме сервис перезапускается тысячи раз в минуту, маскируя корневую причину; не настраивать RestartSec — слишком частые немедле
diagnosticsjournald
SeniorPython Developer > Основы Python > Управление памятью
Короткий ответ Нужно отделить «память на один запрос» от «суммарной памяти при конкурентной нагрузке» — проблема почти всегда в том, что растёт число одновременно обрабатываемых запросов, буферов или незавершённых задач быстрее, чем они освобождаются, и решение зависит от того, какая из причин подтвердится профилированием под реальной многопоточной/многопроцессной нагрузкой. Как это работает подробнее Профиль на один запрос в изоляции не показывает эффект умножения на число конкурентных запросов, рост буферов очередей, накопление соединений в пуле или удержание больших объектов в кэше ответов дольше, чем нужно. При росте RPS каждый из этих факторов может расти нелинейно относительно «память на запрос». Компромисс. Жёсткое ограничение конкурентности защищает процесс от падения по памяти, но ухудшает пользовательский опыт под пиковой нагрузкой и требует продуманной стратегии деградации (очередь, retry на стороне клиента, приоритизация); увеличение лимитов памяти/масштабирование вширь откладывает проблему и стои
garbage-collectionmemory-management
MiddleDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Нужно вводить изменения контракта только обратно совместимым образом (добавление новых необязательных полей, новых эндпоинтов, без удаления/переименования существующих без периода параллельной поддержки) и проверять совместимость автоматически в CI через consumer-driven contract-тесты (например, Pact), которые падают до релиза, если новая версия API сервиса B не удовлетворяет ожиданиям, зафиксированным сервисом A как потребителем. Как это работает подробнее consumer-driven contract testing — потребитель (сервис A) публикует «контракт» с описанием, какие конкретно запросы и ожидаемые ответы ему нужны от поставщика (сервиса B); пайплайн сервиса B перед релизом проверяет новую версию API против всех известных контрактов потребителей, не требуя разворачивать весь стек сервисов для end-to-end теста. Пример кода Что использовать на практике На практике. это дешевле и быстрее полноценных end-to-end тестов между сервисами и даёт раннюю обратную связь именно на этапе CI сервиса-поставщика, до того как н
api-compatibilitycicd-and-release-management
SeniorPython Developer > Основы Python > Наблюдаемость
Короткий ответ Схема должна передавать context через W3C Trace Context заголовки между всеми сервисами и применять sampling — например, 100% для ошибок и медленных запросов, но лишь небольшой процент для обычных успешных; точный процент зависит от объёма трафика и бюджета на хранение. Как это работает подробнее OpenTelemetry SDK создаёт spans в каждом сервисе; context propagation передаёт trace id и флаг сэмплирования в заголовках следующего вызова — решение принимается либо один раз на входе (head-based), либо коллектором после сбора всех spans (tail-based, требующий буферизации). Пример кода Что использовать на практике Рекомендация. head-based проще и дешевле, но может не засэмплировать редкую важную ошибку; tail-based через Collector с политикой «сохранить трассу при ошибке или высокой latency» даёт лучшую видимость, но требует дополнительной инфраструктуры. Компромисс. высокий процент сэмплирования даёт полную видимость, но дорог в хранении; низкий процент дешевле, но рискует упустить редкие инциденты бе
distributed-systemsmonitoring
JuniorSMM Manager > Общее > Публикация и кампании
Короткий ответ Универсального числа этапов нет — это зависит от размера компании, чувствительности темы и типа контента: обычный информационный пост может требовать одного-двух согласующих, а рекламный или кризисный контент — трёх-четырёх (редактор, бренд-менеджер, юрист, иногда руководство). Как это работает подробнее количество этапов согласования определяется внутренним регламентом компании и риском контента — чем выше потенциальный репутационный или юридический риск, тем больше людей должны его проверить перед публикацией. Что использовать на практике На практике. слишком много этапов согласования для простого контента замедляет публикацию и снижает оперативность реакции на инфоповоды, а слишком мало этапов для рискованного контента увеличивает вероятность ошибки — важно находить баланс и заранее определять, какой тип контента требует какого уровня согласования. Пример. Внутренний регламент: обычный пост — 1 согласующий (редактор); пост с UGC или конкурсом — 2 согласующих (редактор + юрист); кризисный отв
approval-workflowpublishing-campaigns
SeniorData Analyst > SQL и данные > SQL
Короткий ответ Выбор определяется не предпочтением языка, а формой задачи, объёмом, частотой изменения правил и местом потребления результата. Для LAG, LEAD, накопительных состояний и первого нарушения последовательности SQL обычно даёт лучший баланс. Как это работает подробнее Self-join понятен при сравнении двух конкретных событий, но число соединений растёт вместе с числом шагов и создаёт fan-out. Оконный запрос сортирует события внутри пользователя и позволяет анализировать соседние состояния в одной логической цепочке. Процедурный код оправдан для сложных автоматов состояний, рекурсивных правил или внешних вызовов. Его цена — отдельная инфраструктура, сериализация данных и более трудная проверка промежуточных результатов. Пример кода Что использовать на практике Начинайте с окон. Используйте стабильный порядок по времени и event_id. Материализуйте повторяемый результат. Не пересчитывайте тяжёлый путь для каждого дашборда. Профилируйте на реальном объёме. Сравнивайте стоимость сортировки, shuffle и размер
etlself-join