TGViewer
Channel Public Channel
Backend Systems | balun.courses

Backend Systems | balun.courses

@balun_courses_backend

Канал школы balun.courses про бэкенд-инженерию в продакшене: Kafka, PgSQL, Redis, Elasticsearch, observability и распределенные системы: https://clck.ru/3C8e7o
Subscribers
379
Photos
18
Videos
0
Links
18
Recent Posts 15 shown
Post #46 102
Создали индекс, чтобы ускорить чтение. В итоге база стала работать медленнее

Запрос выполнялся 800 мс. После добавления индекса – 20 мс. Вроде бы всё отлично. Метрика улучшилась в 40 раз, задачу можно закрывать.

Через пару недель выясняется, что INSERT стал тяжелее, массовые UPDATE тоже просели, а индексы на таблице уже занимают приличный объём) И оптимизация, которая выглядела очевидно успешной, внезапно перестаёт быть такой однозначной 😁

Возьмём обычную таблицу orders. В неё постоянно добавляются новые заказы, меняются статусы, обновляется информация об оплате. На таблице уже есть несколько индексов, потом появляется ещё один – ради того самого медленного SELECT.

С чтением всё хорошо. А вот при каждой вставке PostgreSQL теперь приходится обновлять ещё одну индексную структуру. И чем больше индексов висит на активно изменяемой таблице, тем дороже обходится запись...

С UPDATE ещё интереснее. PostgreSQL из-за MVCC создаёт новую версию строки. Если изменившаяся колонка входит в индекс, индекс тоже приходится обновлять. А если часто изменяемое поле проиндексировано, для такого изменения уже не получится использовать HOT update.

Плюс индекс нужно хранить на диске и обслуживать. На одной маленькой таблице это может быть вообще незаметно. На большой write-heavy таблице – уже нет.

Допустим, запрос, который мы ускорили, выполняется 200 раз в минуту. А INSERT и UPDATE по этой же таблице – 20 000 раз.

После этого цифры 800 мс → 20 мс выглядят уже чуть иначе.

Поэтому перед созданием индекса я бы сначала посмотрел, как вообще живёт эта таблица: сколько на ней чтения и записи, какие индексы уже есть, насколько дорог конкретный запрос и как часто он реально выполняется. Иногда новый индекс действительно оправдан. Иногда дешевле переписать запрос. А бывает, что нужный индекс уже существует, просто PostgreSQL по какой-то причине его не выбирает 🤷‍♂️

На курсе по PostgreSQL как раз будем разбирать индексы на таких кейсах: смотреть на запрос и нагрузку, выбирать решение и потом проверять по EXPLAIN, что изменилось до и после.
  • 🔥 3
  • 👍 1
Post #45 180
Что должен заложить backend-разработчик, если мониторингом занимается другая команда

При разработке нового эндпоинта нужно решить, как отличать ожидаемый отказ по правилам продукта от технического сбоя. Если сбор и хранение телеметрии поддерживает другая команда, кто определит, какие события считать и что записывать в логи?

В разных компаниях задачи backend, DevOps и SRE распределены по-разному. Прикладные сигналы стоит проектировать вместе с разработчиками сервиса: для этого нужно знать логику операций и условия их выполнения.

📋Вот что полезно согласовать до релиза:

✔️Смысл метрик.
Определите, что считается успешным выполнением, ожидаемым отказом и технической ошибкой. Если есть повторные попытки, явно обозначьте, считает метрика отдельные попытки или операции целиком: эти значения отвечают на разные вопросы.

✔️Точки инструментирования.
Проверьте, какие этапы обработки уже видны в телеметрии. Если важный участок прикладной логики не измеряется отдельно, можно добавить span или метрику длительности. Выбор зависит от того, какой вопрос о работе этого участка нужно исследовать.

✔️Состав логов и диагностический контекст.
Согласуйте поля для типа операции, ее результата и категории ошибки, чтобы записи можно было последовательно фильтровать. Request ID помогает находить связанные события, а trace ID в записи - сопоставлять ее с трейсом. Нужный контекст должен быть доступен в тех местах кода, где создаются эти записи.

✔️Ограничения на данные.
Уникальный request ID не стоит добавлять в labels метрик Prometheus: каждая новая комбинация значений меток создаёт отдельный временной ряд и увеличивает расход ресурсов. Состав логов тоже требует проверки - пароли и токены доступа нужно исключить из записей.


Эти решения определяют, какие данные получит команда для диагностики после релиза. На курсе Observability эта работа входит в практику с Go-приложением: вы создаете и экспортируете собственные метрики, настраиваете структурированное логирование, интегрируете OpenTelemetry и анализируете задержки и ошибки по трейсам.

Такая практика полезна backend-разработчику и при готовой инфраструктуре мониторинга: она помогает связать решения в коде с возможностями расследования. Посмотрите программу курса Observability, чтобы оценить, какие из этих задач вам нужно отработать.
  • 👍 1
  • 🔥 1
Post #41 196
🎙 Что меняется во взгляде на backend-систему, когда отвечаешь за ее надежность

Знакомьтесь: Виталий Лихачёв - SRE-инженер и автор курса Observability.
А еще в кадре его кот Маркус 🐱


Виталий рассказывает, как меняется взгляд на production, когда зона ответственности разрастается от нескольких сервисов до целой системы. Почему телеметрию важно продумывать заранее, как связаны надежность и Observability и почему даже AI не поможет разобраться в данных, если они не организованы.

Этот системный подход раскрывается и на курсе: через проектирование полезных сигналов, связь метрик, логов и трейсов и анализ деградаций в цепочках сервисов.

Есть вопросы об Observability? Задавайте их в комментариях 👇
balun.courses Balun.Courses — вся база по Observability Глубокий курс о том, как поставлять логи, метрики, трейсы, делать информативные дашборды, быстро устранять инциденты и правильно интерпретировать данные. Преподает SRE из крупнейшего TravelTech
Post #40 240
Как проследить запрос, если часть пути проходит через очередь

API-сервис принимает запрос, публикует сообщение в Kafka и возвращает ответ. Обработчик получает запись позже, обращается к следующему сервису или базе данных, а связанная с запросом операция выполняется дольше ожидаемого. При этом показатели каждого компонента по отдельности могут оставаться в пределах нормы.

Условная цепочка выглядит так:
HTTP-запрос → сервис-источник → Kafka-топик → обработчик → следующий сервис или БД


После публикации сообщения исходный HTTP-запрос уже завершился, а обработка продолжится в другом процессе или на другом экземпляре приложения. Без передачи диагностического контекста трейс сервиса-источника закончится на публикации, а работа обработчика отобразится как отдельный трейс.

Логи можно попытаться сопоставить по времени, но при параллельной и пакетной обработке, а также повторных попытках такая связь становится ненадёжной. Идентификатор сообщения или бизнес-операции помогает искать события, однако сам по себе не описывает отношения между spans.

Чтобы сохранить связь, producer добавляет контекст трассировки в метаданные сообщения - в Kafka для этого можно использовать record headers. Consumer извлекает контекст во время обработки, после чего с ним можно связать spans обработчика, последующие обращения к сервисам и записи в логах.

Связь между producer- и consumer-span не всегда выглядит как прямая parent-child цепочка. Например, при пакетном чтении consumer получает сообщения с разными контекстами. В таких случаях причинные связи можно сохранить через Span Links.

На курсе Observability этот механизм рассматривается как часть проектирования наблюдаемости системы. В программе связаны Observability асинхронных взаимодействий, работа с OpenTelemetry, корреляция трейсов, логов и метрик, а также поиск высокой latency и ошибок по трейсам. Такой подход помогает исследовать путь операции через несколько компонентов, а не ограничиваться состоянием одного сервиса.

При этом даже связный трейс не гарантирует готового ответа о первопричине. Часть пути может отсутствовать из-за семплирования или неполного инструментирования, а продолжительный span показывает место задержки, но не обязательно объясняет, почему она возникла. Зато команда получает данные, по которым можно последовательно сужать область поиска.

Как это устроено у вас: контекст передаётся автоматически, добавляется в Kafka headers вручную или трейс обрывается после публикации сообщения?
  • 👍 1
  • 🔥 1
Post #39 220
Почему первый шаг зависит от условий

В этом опросе нет одного универсально правильного варианта. Рост p95 latency фиксирует симптом, но сам по себе не показывает его причину. Выбор первой проверки зависит от архитектуры сервиса, доступных сигналов и того, что уже известно к началу расследования.

Метрики помогают определить масштаб проблемы: замедлились все эндпоинты или один, все экземпляры или отдельная группа, совпал ли рост задержки с изменением нагрузки или процентом ошибок. При этом агрегированные значения обычно не объясняют, что происходило внутри конкретного запроса.

Логи полезны, если по времени, эндпоинту или идентификатору запроса можно найти медленные операции и увидеть зафиксированные события. Их возможности ограничены тем, какие данные приложение записывает и насколько последовательно устроено логирование.

Трейсы позволяют сравнить путь медленного и обычного запроса и увидеть, на каком участке выросло время выполнения. Однако длинный span указывает на место задержки, но не обязательно на ее первопричину. Кроме того, нужный запрос может не попасть в выборку, а часть операций - остаться без инструментирования.

Проверка зависимостей оправданна, когда устройство сервиса или первые наблюдения указывают на базу данных либо другой компонент. Здесь важны тот же временной интервал и конкретный сценарий: нормальные показатели зависимости в целом не исключают замедления отдельного запроса или операции.

Релиз, изменение конфигурации или рост трафика тоже могут дать рабочую гипотезу, если совпадают по времени с началом деградации. Такое совпадение еще не доказывает причинную связь, поэтому его нужно проверить по другим данным.

Первым полезно выбирать действие, которое быстрее сузит область поиска или проверит наиболее вероятную гипотезу. Дальше расследование обычно требует сопоставить несколько сигналов по времени, эндпоинту, версии сервиса, request ID или trace ID.

Умение выбирать следующий сигнал и последовательно сужать область поиска - одна из базовых задач Observability.
  • ❤ 1
  • 🤔 1
Post #37 210
Что вы проверяете первым, когда сервис начинает отвечать медленнее?

Условная ситуация: за последние 15 минут у API-сервиса выросла p95 latency. Доля ошибок осталась на обычном уровне, но пользователи подтверждают замедление. Сервис обслуживает несколько эндпоинтов, обращается к базе данных и вызывает другие сервисы. У команды есть метрики, централизованные структурированные логи и распределённый трейсинг.

Инцидент только начался, готового сценария диагностики для этого симптома нет.
Post #36 332
Всё про Kafka есть бесплатно. Тогда за что вообще платить 52 400 ₽?

За саму информацию – наверное, незачем.

Документация Kafka открыта. Доклады спикера можно посмотреть бесплатно. Есть книги, статьи, конференции, чужие postmortem'ы. Если есть время и желание, практически во всём из программы курса можно разобраться самостоятельно.

Проблема обычно появляется не на этапе «где найти информацию».

Допустим, у вас в production растёт consumer lag. Можно открыть документацию и прочитать всё про consumer groups, rebalance, offsets и настройки consumer. Но дальше всё равно придётся самому понять:

• что из этого относится именно к вашей проблеме;
• в каком порядке проверять гипотезы;
• какие рекомендации актуальны для вашей версии и нагрузки;
• почему решение из чужой статьи у вас не сработало;
• какой компромисс допустим именно в вашей системе.

А иногда два вполне компетентных источника вообще советуют противоположные вещи – потому что исходные условия у них разные.

За это и платят на курсе: не за доступ к «секретной информации про Kafka», а за собранную последовательность от задачи к решению.


За 6 недель идём от устройства Kafka к записи, чтению, работе под высокой нагрузкой и стриминговой обработке. Всё это связывается одним проектом – сервисом склада, который усложняется по мере прохождения программы.

Плюс каждую неделю есть Q&A, где вопросы можно задать непосредственно Андрею Серебрянскому – человеку, который 8+ лет работает с Kafka, строил streaming-платформы и сейчас разрабатывает YDB Topics в Яндексе. Не куратору, который сверяет ответ с методичкой.

Поэтому самостоятельно изучать Kafka – абсолютно нормальный вариант.

Курс нужен скорее тогда, когда хочется не просто накопить ещё материалов, а систематизировать знания и научиться применять их к реальным архитектурным задачам.

Стартуем 8 сентября.

➡️Посмотреть программу курса
  • 👍 2
  • ❤ 1
  • 🔥 1
Post #30 299
Не 6 уроков про Kafka, а 6 рабочих задач

Названия уроков сами по себе мало говорят о том, что потом получится делать в работе.

Поэтому на карточках собрали программу иначе – через задачи, которые участники будут учиться решать на курсе❤️

Там: как выбрать брокер под требования системы, настроить запись, найти причину consumer lag, рассчитать кластер под рост нагрузки, выбрать инструмент для стриминговой обработки и разобраться, где новые возможности Kafka уже могут заменить самописные решения.


Все эти темы проходят не отдельно друг от друга. На курсе есть сквозной проект – сервис склада, который постепенно усложняется от занятия к занятию: сначала поднимаем Kafka, затем добавляем запись и чтение, CDC, схемы, безопасность и потоковую обработку.

Курс рассчитан на Middle/Senior-разработчиков и архитекторов, которым уже недостаточно просто подключить producer и consumer.

💾Основная задача – научиться принимать решения вокруг Kafka так, чтобы система нормально переживала рост нагрузки и её не приходилось переделывать после первых серьёзных проблем.

Старт – 8 сентября.

Через 2 дня – финальное повышение цены на курс. Если планировали идти, до повышения можно зафиксировать текущую стоимость.

➡️ИЗУЧИТЬ ПРОГРАММУ КУРСА
  • 🔥 4
  • ❤ 2
  • 👍 1
  • 🥰 1
Post #28 299
Найдите ошибки в этой Kafka-архитектуре

На схеме – условная система склада. Что в ней есть:

• все события пишутся в один топик;
• partition key выбран по типу события;
• у топика всего 3 партиции;
• данные читают несколько команд, но без Schema Registry;
• retention = 1 день;
• ошибки обработки бесконечно уходят в retry.

Что именно здесь может сломаться или начать дорого обходиться команде?
Post #27 506
Сколько клеток закрывается на вашем архитектурном созвоне? 👀

Собрали bingo из фраз, которые подозрительно часто звучат на архитектурных обсуждениях.

Отмечайте, что слышали в последнее время)

Если собрали bingo – присылайте тому самому коллеге 🙂
  • ❤ 2
  • 🔥 2
  • 😁 2
Older posts →

About this channel

How can I read @balun_courses_backend without a Telegram account?
TGViewer shows the public web preview Telegram publishes for Backend Systems | balun.courses: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does Backend Systems | balun.courses have?
Backend Systems | balun.courses (@balun_courses_backend) has 379 subscribers on Telegram, refreshed roughly every 30 minutes.
Does Backend Systems | balun.courses know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →