15708
Присоединяйтесь к нашему каналу и погрузитесь в мир Backend-разработки Связь: @devmangx РКН: https://clck.ru/3FobxK
Шаги SQL-запроса
Когда выполняется этот SQL-запрос, я представляю это так: каждая строка в запросе превращает одну таблицу в другую.
👉 @BackendPortal
8 ключевых концепций в предметно-ориентированном проектировании
👉 @BackendPortal
⭐️ Road to Highload: видеопроект о проектировании архитектуры высоконагруженных систем
Инженеры Яндекс 360 накопили значительный опыт в проектировании и разработке систем, которыми пользуются больше 95 миллионов человек ежемесячно.
В этом видеопроекте разработчики на практических примерах рассказывают, как создают архитектуру систем, которые держат 1 000 000 RPS и хранят петабайты мета-данных.
В выпусках обсуждаем:
🎙 Серия 1. Функциональные и нефункциональные требования. Как сбор требований помогает создавать надёжные и масштабируемые решения
🎙 Серия 2. Надёжный API. Принципы проектирования API, которые помогут сделать его консистентным, предсказуемым и поддерживаемым
🎙 Серия 3. Крупноблочная архитектура: карта вашей системы. Как выглядит модель на примере Яндекс Календаря и как ребята применяют её для эффективной коммуникации с различными командами разработки
🎙Серия 4. Практика: Рост баз данных: от единиц запросов к тысячам. Как правильно организовать работу с БД, чтобы система оставалась стабильной и эффективной
🎙 Серия 5. Практика. Взаимодействие со смежными системами. Типичные сложности, с которыми сталкиваются команды при интеграции с внешними сервисами, и как их предотвратить или минимизировать
Сколько памяти на самом деле жрут структуры данных в Java (на один элемент):
int[] → 4 байта
Integer → ~16 байт
ArrayList<Integer> → ~24 байта
LinkedList<Integer> → ~48 байт
HashMap<K, V> → ~64–72 байта
TreeMap<K, V> → ~72–80 байт
ConcurrentHashMap → ~80–90 байт
👉 @BackendPortal
freeCodeCamp только что запустили бесплатную интерактивную программу, где можно изучить SQL и реляционные базы данных, а затем получить верифицированный сертификат для LinkedIn.
В курсе разобраны все ключевые темы. Практику можно делать в своем локальном редакторе кода, после чего пройти финальный экзамен.
Полный анонс и подробный FAQ здесь
👉 @BackendPortal
Только что открыл для себя Resend Go SDK — пожалуй, самый чистый и удобный способ отправлять письма из Go-приложений.
Простой и понятный API
Строгая типизация, нативная поддержка Go
Встроенная поддержка шаблонов
Массовая отправка писем
Webhooks и трекинг доставляемости
Отлично подходит для транзакционных писем, уведомлений и не только. Больше не нужно возиться с настройками SMTP.
Заценить можно тут ❤️
👉 @BackendPortal
Биллинговое решение для хостинг-компаний.
GitHub: https://github.com/Paymenter/Paymenter/
👉 @BackendPortal
Привыкнув к визуальным редакторам вроде VS Code, каждый раз после SSH-подключения к серверу и необходимости править конфиги через Vim не хочется
На GitHub нашёл проект Fresh. Он переносит привычный графический опыт редакторов прямо в терминал.
Поддерживает работу мышью, прокрутку и стандартные хоткеи. Открыл и сразу работаешь, без заучивания команд.
При этом спокойно открывает файлы размером в несколько гигабайт, а потребление памяти практически незаметно.
👉 @BackendPortal
🎬 Что это? А это второй выпуск нового интерактивного шоу «АйТир Лист» от МойОфис
«АйТир Лист» – это шоу, в котором эксперты оценивают технологии, компании, фреймворки и ИТ-решения по шкале от 1 до 4. Каждый выпуск — это 14 табличек от модератора, жаркие дискуссии и итоговый рейтинг, который поможет зрителям разобраться в актуальных трендах и сделать собственные выводы.
Во втором выпуске мы оценим фичи и идиомы C++.
Гости выпуска:
— Данил Черепанов, архитектор Редакторов МойОфис
— Антон Полухин, эксперт-разработчик C++ Техплатформы Городских сервисов Яндекса
🎥 Смотрите наш юбилейный второй выпуск там, где вам удобно:
VK | YouTube | RuTube
Реклама
ООО "НОВЫЕ ОБЛАЧНЫЕ ТЕХНОЛОГИИ"
ИНН: 7703807270
erid: 2W5zFJ7ManC
В SQLite около 155 800 строк кода, а тестовый набор - примерно 92 миллиона строк. Это примерно в 590 раз больше тестов, чем самого кода 🤯
Вот такой уровень тестирования нужен для настоящей продакшен-базы данных. Ниже — какие типы тестов у них есть.
» Тесты на нехватку памяти (OOM)
SQLite не может просто упасть, когда заканчивается память. На встраиваемых устройствах OOM — обычное дело. Они симулируют падения malloc в каждой возможной точке и проверяют, что база корректно это переживает.
» Тесты I/O-ошибок
Диски ломаются. Сеть отваливается. Права могут измениться посреди операции. SQLite подменяет файловую систему на кастомный слой, который может симулировать сбои после N операций, и проверяет, что данные не повреждаются.
» Краш-тесты
Что будет, если питание пропадёт посреди записи? Они симулируют крэш в случайные моменты во время записи, портят несинхронизированные данные, как это делает реальная файловая система, и проверяют, что транзакция либо полностью завершилась, либо чисто откатилась. Никакой порчи данных.
» Fuzz-тестирование
В SQLite кидают кривой SQL, битые файлы базы и случайный мусор. Инструмент dbsqlfuzz прогоняет около 500 миллионов мутаций тестов в день на 16 ядрах.
» 100% покрытие ветвлений
Каждая инструкция ветвления в ядре SQLite проверяется в обе стороны. Не просто «эта строка выполнялась», а «это условие было и true, и false».
Базы данных вообще не прощают ошибок :)
Если хочется копнуть глубже, советую почитать официальную документацию SQLite про их стратегию тестирования. Очень практично и по делу. А если понравился пост - ставь реакцию 👌
👉 @BackendPortal
Обобщённые инвертированные индексы (GIN) - мощный инструмент в Postgres.
Они хороши тем, что переворачивают привычную модель индексации.
Вместо логики вида: строка с ID 2 содержит значение "become a database expert", индекс хранит обратное соответствие: токен "database" указывает на строки с ID 1, 2 и 3, а "expert" — на строку с ID 2.
GIN-индексу на вход подаётся набор значений для каждой строки, которую нужно проиндексировать. Каждое уникальное значение становится ключом в индексе и сопоставляется с набором CTID (идентификаторов кортежей строк), в которых это значение встречается.
У такого подхода есть несколько сценариев применения, и один из самых популярных - полнотекстовый поиск. В MySQL для этого есть отдельный тип индекса FULLTEXT, а в Postgres похожая функциональность строится на более универсальных GIN-индексах.
Как это выглядит на практике:
(a) Добавляем колонку tsvector в таблицу:
CREATE TABLE post (
author TEXT,
publish_date DATE,
content TEXT NOT NULL,
search_vector tsvector
);
UPDATE post
SET search_vector =
to_tsvector('english', content);
CREATE INDEX post_search_idx
ON post USING GIN(search_vector);
SELECT * FROM post
WHERE search_vector @@
to_tsquery('english', 'database & expert');
Postgres CTE
-» небольшие, читаемые блоки SQL
-» можно тестировать запрос по частям
-» переиспользовать фрагменты SQL в других запросах
👉 @BackendPortal
Хорошие новости для пользователей Postgres под конец года. Команда TimescaleDB выпустила и открыла исходники расширения pg_textsearch.
В Postgres уже есть встроенный полнотекстовый поиск, а это расширение делает его более современным и продвинутым за счёт добавления ранжирования BM25.
👉 @BackendPortal
Практический Docker Roadmap
Она включает более 50 практических заданий, дополненных десятками визуальных разборов и несколькими теоретическими глубокими погружениями. На данный момент вы можете изучить:
- Как запускать разные типы контейнеров (веб-приложения, CLI-утилиты, базы данных и т.д.)
- Как перечислять, инспектировать и управлять локальными контейнерами
- Как выполнять команды внутри контейнеров и отлаживать простые проблемы
- Как обновлять контейнерные образы для stateless и stateful приложений
- Как собирать контейнерные образы как профи
...и несколько других тем
https://labs.iximiuz.com/roadmaps/docker
👉 @BackendPortal
Проверяет наличие электронной почты без отправки письма.
https://github.com/reacherhq/check-if-email-exists/
👉 @BackendPortal
Какой план на последнюю рабочую пятницу? У нас — AvitoTechno 🎧
Уже все говорят, что это будет главная онлайн-техно-вечеринка для ИТ-комьюнити!
Что там будет:
➡️ сеты от разработчиков диджей-команды AvitoTech;
➡️ выступление BÖRIS REDWÄLL и группы LAVBLAST;
➡️ розыгрыш лимитированного AvitoTechno-бокса (птички напели, что там свитер, шапка, обвес и снежный шар с котиком!).
Как попасть?
Забирайте свой бесплатный билет в боте.
Встретимся на AvitoTechno. Проводим этот рабочий 2025-й технично и крышесносно 🚀
Популярные стратегии деплоя и ведения Git
» Feature Branch Workflow
Работа ведётся в отдельных фича-ветках, потом мёрдж в main через PR.
» GitHub Flow
Короткоживущие ветки, частые мёрджи, удобно для непрерывного деплоя.
» Git Flow
Структурированная модель: разработка, релизные ветки и хотфиксы.
» Trunk-Based Development
Минимальные ветки или прямые коммиты в main, упор на CI и стабильность.
👉 @BackendPortal
Нормализует контактные данные и блокирует временные почтовые домены.
https://github.com/GeKorm/better-auth-harmony/
👉 @BackendPortal
Превратите любой репозиторий GitHub в богатую, удобную для навигации документацию.
Просто замените «github» на «deepwiki» в URL-адресе репозитория.
👉 @BackendPortal
Разверните свою облачную среду за несколько минут: виртуальные машины, S3-совместимое хранилище, Managed Kubernetes, базы данных.
▪️Быстрый старт, прозрачный биллинг, российские дата-центры.
▪️Удобные интерфейсы управления: веб-консоль, CLI, API, Terraform.
▪️Собственная разработка: развиваем облако так, как нужно пользователям, а не ждём решений от вендоров.
Развивайте свои IT-продукты. Об инфраструктуре позаботится облако.
Попробуйте MWS Cloud Platform бесплатно с грантом для новых пользователей.
Потоковая передача музыки с YouTube с фоновым воспроизведением и кэшированием.
https://github.com/25huizengek1/ViTune/
👉 @BackendPortal
Сервер для потоковой трансляции видео, написанный на Go.
GitHub: https://github.com/gwuhaolin/livego/
👉 @BackendPortal
Элегантное разделение ответственности в Apache Kafka даёт кучу возможностей для масштабирования.
Но за это приходится платить компромиссами.
Производитель, потребитель и брокер.
👉 @BackendPortal
Два года назад парень сделал максимально простой демо-пример, который на уровне операционной системы показывает, что происходит, если не использовать пул соединений для Postgres.
С тех пор его рекомендуют даже LLM, и он регулярно получает такой фидбек:
«Впервые наглядно понял, как работает connection pooling».
Это и подтолкнуло поделиться этим видео с вами, друзья 🎷 - смотреть
👉 @BackendPortal
В софте очень часто работают так: система хранит текущее состояние.
Например:
» у пользователя такой баланс
» заказ сейчас в таком статусе
» подписка активна
Event Sourcing предлагает другой подход.
Идея простая:
хранить не финальное состояние, а всю историю изменений.
То есть вместо того, чтобы сохранять
balance = 100
deposit +200
purchase -50
adjustment -50
В небольшом приложении один HTTP-запрос обычно делает всё.
Например, пользователь регистрируется.
Бэкенд сохраняет пользователя, отправляет welcome-письмо, пишет метрики и только потом отвечает. Работает, но пользователь ждёт дольше, а если что-то ломается посередине, может упасть вся операция.
Проблема в том, что в одном потоке смешиваются критичные и второстепенные задачи.
Создать пользователя -» критично. Отправить welcome-письмо -» нет. Когда всё идёт в одном флоу, у всего одинаковый вес, и приложение начинает тормозить.
В более крупных системах это решают через Message Queue.
Бэкенд выступает как producer -» сохраняет пользователя и кладёт сообщение в очередь с отложенной задачей, например «отправить welcome-email». На этом запрос заканчивается и быстро отдаёт ответ.
Позже один или несколько воркеров забирают сообщение из очереди и выполняют задачу. Если отправка письма упала, её можно ретраить, не затрагивая пользователя.
Так создание пользователя и отправка письма перестают зависеть друг от друга.
Обратная сторона -» в системе появляется больше компонентов и растёт сложность.
👉 @BackendPortal
Почему JSON жрёт ваш CPU
Ваш API тормозит. Вы грешите на базу. Потом на сеть. А реальным бутылочным горлышком может быть язык, на котором вы общаетесь.
JSON — это не формат данных. Это текстовая строка.
Каждый раз, когда вы отправляете {"id": 12345}, сервер платит скрытый налог на парсинг. Даже с современными SIMD-оптимизированными парсерами текст упирается в архитектурные ограничения, которых нет у бинарных форматов.
Разбор по инженерке:
1. Стоимость для CPU (машина состояний против арифметики)
JSON (текст):
Чтобы прочитать число 12345, CPU получает поток байт. Даже самые быстрые парсеры вроде simdjson вынуждены работать как машина состояний:
- искать структурные разделители (: и ,)
- проверять escape-последовательности ()
- конвертировать число: проход по ASCII-символам, вычитание '0', умножение на степени 10 и суммирование
Всё это — ветвления, промахи предсказателя и обращения к памяти.
-» Protobuf (бинарь):
Передаёт либо Varint (для маленьких чисел), либо фиксированную ширину (для больших).
Fixed-width (например, fixed32) — это просто memcpy. Парсинга нет вообще.
-» Varint — чтение байт по одному с проверкой старшего бита (MSB), продолжается ли число.
Итог: декодирование сводится к нескольким битовым сдвигам и маскам. Для числовых нагрузок это гарантированно быстрее любого текстового парсинга.
2. Стоимость по пропускной способности (энтропия против избыточности)
JSON:
[{"status": "active"}, {"status": "active"}]
SELECT FOR UPDATE в Postgres фактически делает запись
В heap-странице Postgres у каждого tuple есть заголовок header с метаданными.
Когда транзакция выполняет SELECT FOR UPDATE, у найденных tuple (по предикату) обновляется header: они помечаются как залоченные, а атрибут xmax фиксирует XID транзакции, которая поставила лок.
Конкретно выставляются два бита в infomask заголовка: HEAP_XMAX_EXCL_LOCK и HEAP_XMAX_LOCK_ONLY.
Из-за этого страница становится dirty и это также попадает в WAL, который потом может уехать на standby-реплику.
Позже dirty-страница может быть сброшена на диск background writer-ом.
На commit эти биты очищаются.
Забавно, что операция чтения может породить приличный объём write I/O.
👉 @BackendPortal
Поздравляем, вы на 1 шаг ближе к работе мечты 🥳
Осталось только прочитать этот пост, подписаться на канал и откликнуться на вакансию 😉
Avito Career — место, где Авито делится актуальными вакансиями и стажировками для бэкенд-разработчиков.
Подписывайтесь, чтобы найти ту самую работу ✨
Если ты активно пользуешься JavaScript Intl API, можно выжать немного больше производительности.
Зацени intl-formatter: маленькая обертка, которая добавляет мемоизацию без настроек и при этом сохраняет тот же интерфейс Intl API. В AdonisJS мы такое используем уже много лет.
Бенчмарки: https://github.com/poppinss/intl-formatter?tab=readme-ov-file#benchmarks
👉 @BackendPortal