На прошлой неделе мы собрали в зале 120 питонистов! Обсудили с ними главные технические изменения в Python за год и разобрались, что происходит с культурой и экспертизой в сообществе. Поговорили про 3.14, PEP’ы и Rust в CPython, а ещё поделились прогнозами.
Благодарим экспертов:
А ещё спасибо всем, кто был с нами офлайн и онлайн, участвовал в дискуссии и задавал вопросы!
Подписывайтесь:
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12🔥3🤔2👍1🌚1
Долгий процесс со множеством состояний, таймеров и внешних событий создаёт много сложностей при разработке. Раньше для такой системы нужны были не просто танцы с бубном, а целый концерт: стейт‑машина с полудюжиной состояний, очереди и воркеры, обработчики на каждое событие и блокировки от race conditions.
С этой проблемой мы столкнулись и в процессинге Яндекс Еды. Жизненный цикл заказа от оплаты до доставки — яркий пример такой распределённой логики. Но в итоге решение мы нашли. И весьма элегантное.
e, err := w.prepareExecutor(ctx, req)
if err != nil {
return nil, err
}
if err := e.CreateAndPay(); err != nil {
return e.HandleResult(err)
}
if err := e.InitializeNativeDelivery(); err != nil {
return e.HandleResult(err)
}
if err := e.WaitForOrderConfirmation(); err != nil {
return e.HandleResult(err)
}
if err := e.WaitDelivery(); err != nil {
return e.HandleResult(err)
}
return e.HandleResult(nil)
Теперь это выглядит как одна линейная функция-воркфлоу. Она читается как описание бизнес-логики, но при этом гарантированно выполняется от начала до конца. А ещё она переживает падения сервисов и временные сбои зависимостей.
А ещё в статье мы разбираем:
Подписывайтесь:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🥴4🙈4💊1
Есть способы защиты, которые можно использовать в продуктовом коде уже после релиза. Это харденинг — система, которая позволяет находить и предотвращать различные ошибки и уязвимости. Например, выходы за границу буфера, обращения по невалидному адресу, переполнения целочисленной переменной и так далее.
Для C/C++ это особенно актуально. Так, 70% уязвимостей в Microsoft и критических багов в Chromium — ошибки памяти, а из них 70% — это 0-day. Некоторые госучреждения и вовсе рекомендуют избегать C++ в пользу более безопасных языков.
С этой атаки началась практическая эксплуатация уязвимостей памяти. Злодей переполняет буфер, перезаписывает локальные переменные и адрес возврата. После этого он кладёт на стек вредоносный код и изменяет адрес возврата так, чтобы процессор начал выполнять его после выхода из функции. Это часто приводит к получению полного контроля над системой.
В этой атаке вместо размещения своего кода злоумышленник перезаписывает адрес возврата на стандартную библиотечную функцию, которая уже присутствует в памяти. На 32-битных системах аргументы для неё также передаются через стек, поэтому хакер может заставить программу выполнить команду в обход запрета на выполнение кода в стеке.
Атакующий находит короткие последовательности инструкций, которые заканчиваются командой возврата ret. Путём переполнения буфера на стеке создаётся целая цепочка таких адресов, после чего начинаются прыжки туда-сюда. В результате хакер получает доступ к шеллу.
Эта угроза связана с переполнением буфера, расположенного не на стеке, а в динамической памяти — куче. Это позволяет перезаписать данные соседнего буфера и контролировать критичные для программы переменные. А ещё так можно испортить метаданные аллокатора.
А весь плейлист целиком с другими докладами C++ Zero Cost Conf 2025 найти можно тут:
Подписывайтесь:
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Рекомендательный движок Яндекса обрабатывает свыше миллиона запросов в секунду. В наших масштабах даже 1% экономии в конкретном сервисе превращается в тысячи процессорных ядер. А за последние три года мы ежегодно высвобождали аж по 200 000 единиц.
На связи Антон Полднев, руководитель инфраструктуры Яндекс Рекламы. Сегодня я расскажу, как нам удалось добиться этого результата и какие решения лежат под капотом нашего движка рекомендаций.
5–6 лет назад наша система была единым монолитом с шардированием по данным. При пиковой нагрузке мы могли только отключать шарды, а это вело к финансовым потерям. Мы оптимизировали код по флеймграфам и внедряли простые ML-модели, чтобы отсекать кандидатов, но достигли локального оптимума. В итоге негибкая архитектура не выдерживала нагрузки.
Тогда мы сформулировали три принципа новой архитектуры:
Лёгкая ML-модель оценивает на старте, может ли пользователя заинтересовать какая-либо реклама. Если нет — мы избегаем сложных вычислений и сохраняем ресурсы.
Вместо алгоритмического подбора по ключевым словам мы перешли к методам поиска ближайших соседей. Нейросеть сопоставляет пользователей и объявления в едином векторном пространстве, что повышает и эффективность, и качество.
Сначала кандидатов отфильтровывает лёгкая модель, а потом тяжёлая. Так у нас появляется возможность использовать сложные алгоритмы без роста нагрузки.
Когда мы заявили, что средняя утилизация сервисов в 30–40% — это не предел, а повод для основательной оптимизации, нам не верили. Дескать, при большей нагрузке не избежать серьёзной деградации.
Мы изменили подход:
Мы перенастроили систему шедулинга, чтобы деградация происходила по длине очереди, а не по времени обработки уже взятых задач.
С помощью PID-контроллера мы в реальном времени регулируем порог отсечения запросов с низким профитом. Это даёт возможность «прореживать» очередь в пиках и жертвовать 1% качества, чтобы экономить 15% нагрузки.
Мы научились учитывать гетерогенность железа и направлять больше запросов на более производительные машины, чтобы снизить дисперсию.
В результате нам удалось поднять утилизацию и изъять 10–20% лишних ресурсов из сервисов.
От Protobuf к собственному формату
Перекладывание данных — тихий убийца производительности. Мы прошли путь от ручной сериализации через Protobuf к FlatBuffers. Однако операции чтения оставались заметно более дорогими по сравнению с чтением полей из простых структур.
Мы создали собственный формат YAFF, который объединил лучшие черты Protobuf (схему) и FlatBuffers (подход к доступу), и оптимизировали его для современных процессоров. В итоге получили двукратное улучшение CPU time, а размер сообщений сократился на треть.
Микросервисы, которые экономят
Принято считать, что разделение монолита — это компромисс между скоростью разработки и эффективностью. Мы доказали обратное. Вынос логики «быстрых счётчиков» в отдельный микросервис позволил создать в нём специализированный кеш под наши паттерны доступа (например, с группировкой по экспериментам, а не по кампаниям).
Это улучшило локальность данных и преобразовало CPU-bound-задачу в memory-bound, что в совокупности позволяет экономить CPU.
Наш опыт демонстрирует, что экономия на масштабе — это не только оптимизация алгоритмов. Ещё это:
Кстати, с этой темой Антон выступал на конференции «Я про бэкенд». Доклад можно посмотреть на платформах:
Презентацию выступления Антона прикрепляем ниже
Больше записей докладов с конференции собрали для вас в плейлистах:
Подписывайтесь:
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤🔥3❤2🤔1
В Яндекс 360 мы разрабатываем сервисы с очень большими нагрузками как по RPS, так и по объёму данных. А ещё в них много задач, которые должны выполняться асинхронно. Например, скопировать большую папку с тысячей файлов. Или уведомить пользователя о том, что у него загрузился файл, чтобы десктопное приложение смогло начать синхронизацию.
Для подобных сценариев в своей инфраструктуре мы используем очереди поверх SQL‑баз. Да, многие скептически назовут такой подход антипаттерном. Попыток реализовать очереди на PostgreSQL и MySQL было немало, и часто они идут в комплекте с типовыми проблемами: от блокировок до деградации производительности. Но в реальности такие решения встречаются повсеместно.
На связи Дима Кривопальцев, тимлид бэкенд‑команды Яндекс Диска. Я расскажу, как мы организовали очереди поверх SQL-баз, разобрались с ретраями, организовали выборку задач воркерами и наладили отказоустойчивость.
Читайте на Хабре:
Подписывайтесь:
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤7🤔2👏1
Технология Client Hints — это новый стандарт обмена данными между браузером и сервером, который постепенно заменяет устаревший User Agent. Вместо того чтобы получать длинную, сложную и часто избыточную строку, сайты теперь могут запрашивать только ту информацию, которая им действительно нужна: версию браузера, тип устройства и другие параметры.
Ключевые преимущества:
Подписывайтесь:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥3👍2
with принимать как синхронные, так и асинхронные контекстные менеджеры в одном операторе через ключевое слово asyncПодписывайтесь:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🔥7🎄3
This media is not supported in your browser
VIEW IN TELEGRAM
Сложные системы, десятки тысяч строк кода… и всего 30 секунд, чтобы это объяснить. Всё это в челлендже для участников C++ Zero Cost Conf.
Подписывайтесь:
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤4
В 2025-м мы продолжали строить сообщество инженеров и рассказывать про опыт бэкенд-разработчиков Яндекса.
И пока 2026-й не выкатили в прод, давайте посмотрим, как зарелизился 2025-й.
И в итоге пообщались в офлайне более чем с 3500 разработчиками. Рады знакомству со всеми 💚
Оставайтесь с нами и в следующем году: впереди ещё много интересного! А теперь — отдыхать и есть мандаринки.
Ваш Yandex for Backend
Подписывайтесь:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🎉7🔥4💊1