15708
Присоединяйтесь к нашему каналу и погрузитесь в мир Backend-разработки Связь: @devmangx РКН: https://clck.ru/3FobxK
⚡️ На Stepik вышел курс по Linux
Внутри 20+ модулей: от установки Linux и работы с файлами до сетей, прав, дисков, процессов, автоматизации на Bash и многого другого. Всё сразу закрепляется на практике (200+ заданий с автопроверкой).
Материал подаётся понятным языком, шаг за шагом, на реальных примерах и с наглядными схемами.
После прохождения вы получите сертификат, который можно добавить в резюме.
Есть бесплатные демо-уроки для ознакомления. В ближайшие 48 часов курс доступен со скидкой 20%: открыть курс на Stepik (скидка применяется по этой ссылке)
Концепции API, которые обсуждают на собеседованиях, не пропускай, если ты backend-разработчик:
I. Идемпотентность: понимайте, почему PUT/DELETE идемпотентны, а POST — нет. Это помогает избегать случайных двойных записей.
II. Пагинация: offset работает до определённого масштаба. Для больших наборов данных используйте курсор/ключи
III. Версионирование: URI vs Header vs Query param. Единственно правильного способа нет, есть только компромиссы.
IV. Ограничение частоты запросов: Token bucket лучше простой фиксированной временной окна, если важна справедливость.
V. Контракты ошибок: 400 ≠ 422 ≠ 409. Не кидайте 500 повсюду.
VI. Кэширование: ETag + Cache-Control спасают от лишней нагрузки на БД.
VII. Безопасность: JWT истекают не просто так. Не храните в них PII пользователей.
VIII. N+1 запросы: убивайте их на ранней стадии. Используйте batching или join’ы при возврате вложенных ресурсов.
IX. Документация: OpenAPI/Swagger обязателен.
X. Консистентность: иногда кэшированных данных хватает.
👉 @BackendPortal
Бесплатный прирост производительности для full table scan в Postgres 17
Смотри, Postgres как и большинство баз данных работает с фиксированными по размеру страницами. В таком формате хранится всё, включая индексы и данные таблиц. Размер страницы 8КБ, каждая страница содержит строки или индексные кортежи плюс фиксированный заголовок. По сути, страницы это просто байты в файлах, которые читаются и кешируются в buffer pool.
Например, чтобы прочитать страницу 0, вызывается read с offset 0 и длиной 8192 байта. Чтобы прочитать страницу 1, выполняется ещё один системный вызов read с offset 8193 и длиной 8192. Страница 7 это уже offset 57 345 и так далее.
Если таблица занимает 100 страниц в файле, то для full table scan мы сделаем 100 системных вызовов. У каждого вызова есть накладные расходы
Фича в Postgres 17 в том, что теперь можно объединять I/O. Можно задать, сколько операций объединять. Технически можно просканировать всю таблицу за один системный вызов. Это не всегда хорошая идея, и я ещё расскажу почему.
Также здесь добавили vectorized I/O с помощью системного вызова preadv, который принимает массив офсетов и длин для рандомных чтений.
Основная сложность это не читать лишнего. Допустим, я делаю seq scan и ищу конкретное значение. Я читаю страницу 0, нахожу результат и выхожу. Дальше читать не нужно. А с этой фичей я могу прочитать сразу 10 страниц за один вызов, вытащить их содержимое в shared buffers и только потом обнаружить, что результат был уже на первой странице. В итоге я зря потратил диск, память и пропускную способность.
Балансировать это будет непросто.
Важно понимать, что настоящий Postgres делает системный вызов в ядро, чтобы прочитать по 8К за раз. При этом ядро можно настроить на read ahead. В этом случае оно будет читать немного больше и кешировать данные в файловом кеше.
👉 @BackendPortal
Суперпонятные гайды по программированию: ООП, Docker, Kubernetes, Git, OAuth — всё объясняется на примере милых котиков! 🐱
👉 @BackendPortal
Как работает ветвление по Gitflow?
👉 @BackendPortal
Как backend-разработчику в 2025 году оставаться востребованным
Изучи эти 11 навыков
I. Проектирование API — REST, GraphQL, gRPC.
II. Аутентификация и авторизация — OAuth2, JWT, OpenID Connect, Passkeys.
III. Базы данных — SQL, NoSQL, шардинг, индексы, оптимизация запросов.
IV. Кэширование — Redis, CDN, стратегии edge-кэширования.
V. Событийно-ориентированные системы — Kafka, Pulsar, стриминговые пайплайны.
VI. Конкурентность и асинхронность — реактивное программирование, структурированная конкуренция.
VII. Распределённые системы — микросервисы, service mesh, eventual consistency.
VIII. Безопасность — HTTPS, шифрование, zero trust, OWASP top 10.
IX. Обсервабилити — логирование, трассировка, метрики, OpenTelemetry.
X. Облако и деплоймент — Docker, Kubernetes, serverless, GitOps.
XI. Интеграция ИИ — LLM API, векторные базы данных, retrieval-augmented системы.
Хватит прыгать с одного языка на другой.
👉 @BackendPortal
Вопрос по системному дизайну
Как убедиться, что реплика синхронизирована с мастером и что данные корректны?
Мастер отправляет репликам логические операции, которые они применяют по порядку:
{"op": "add", "id": "apple"}
{"op": "add", "id": "apple"}
{"op": "remove", "id": "orange"}
Краткая шпаргалка по шаблонам проектирования
Автор: Jason McDonald.
👉 @BackendPortal
AdvCache — highload in-memory HTTP cache & reverse proxy на Go (production-ready)
Кому и где полезен. k8s‑friendly слой кэширования на входе трафика: как ingress/edge‑кэш перед сервисами или sidecar рядом с ними.
Подходит — там, где нужны стабильные SLO по латентности, разгрузка upstream и экономия железа.
— Основа на fasthttp: предсказуемая латентность, hot‑path = zero allocs.
— Per‑shard LRU (честные списки) или redis‑style LRU sampling — выбирайте под профиль нагрузки.
— Входная W‑TinyLFU + Doorkeeper/Count‑Min: агрессивная фильтрация шума → выше hit‑rate.
— β‑refresh (стохастическое обновление до TTL), управление upstream (health‑пробы, карантин, лимиты).
— Потоковое сжатие ответов, метрики Prometheus/VictoriaMetrics, дампы с CRC32, лёгкий оркестратор воркеров.
— Бенчмарки и E2E‑тесты в репозитории; код — production.
Цифры. Bare metal, 12 ядер: 250 000 RPS при среднем документе ≈ 5.5 КБ. При заполнении хранилища 50 ГБ — GC‑pause ≈ 5 мкс.
🔒 Лицензия: Apache‑2.0
GitHub ⭐️
https://github.com/Borislavv/adv-cache
#Go #Golang #HighLoad #Cache #LRU #TinyLFU #ReverseProxy #fasthttp #Performance #OpenSource
SQLZap это прям находка
sqlzap.com — это онлайн-платформа для тренировок SQL-запросов в браузере. Что-то вроде интерактивного тренажёра
Идеально чтобы натаскать руку (как Leetcode, только для SQL)
👉 @BackendPortal
Сегодня отмечается День программиста!
256-й день года выбран не случайно:
Дата праздника объясняется расчетом: 2 (двоичная система исчисления) в степени 8 (количество битов в байте). То есть 2^8= 256. Поэтому в обычный год день программиста 13 сентября, а в високосный — 12 сентября
Делюсь настоящей сокровищницей по систем-дизайну.
В этом репозитории собрана огромная коллекция материалов о том, как строить масштабируемые, надежные и быстрые системы. Тут есть статьи инженеров из FAANG и других компаний, реальные кейсы с архитектурами, которые выдерживают миллиарды запросов, схемы и принципы работы сервисов, а также разборы фейлов, после которых компании восстанавливали свои системы с нуля.
И бонусом идёт шпаргалка для подготовки к собеседованиям по систем-дизайну. 🎉
👉 @BackendPortal
Большинство думает, что SQL медленный. Это не так.
Медленные у них запросы. Лови простое введение в функциональные индексы.
Что такое функциональный индекс?
• Обычный индекс говорит: «Я помогу тебе быстрее найти значение в этой колонке».
• Функциональный индекс говорит: «Я помогу тебе быстрее найти результат функции».
Пример:
-- Обычный фильтр (медленно)
WHERE EXTRACT(YEAR FROM order_date) = 2023;
-- С функциональным индексом
CREATE INDEX idx_order_year ON orders ((EXTRACT(YEAR FROM order_date)));
YEAR() не вычисляется для каждой строки — он просто ищется в индексе, как в словаре.LOWER(email) → поиск без учёта регистраSUBSTRING(code, 1, 4) → поиск по части строкиprice * quantity → вычисляемые поляEXTRACT(MONTH FROM signup_date) → фильтр по месяцу
Нашёл классный опенсорс инструмент: ConfMap
Он превращает YAML и JSON-конфиги в интерактивные майнд-мапы. Можно искать ключи и значения, кликать по нодам, сворачивать ветки и быстро разбираться даже в самых запутанных структурах.
Забираем здесь: ConfMap или c GitHub 🤩
👉 @BackendPortal
⚡️ Айтишник из «VISION» скупил топовые айти-курсы и выложил гигабайты материалов к себе
Каждый найдет что-то по душе:
1202 ГБ — Python
1811 ГБ — Frontend
1100 ГБ — C / C++ / C#
804 ГБ — Java
411 ГБ — SQL & БД
309 ГБ — DevOps
998 ГБ — ИБ & Хакинг
773 ГБ — Kotlin / Swift
189 ГБ — PHP
201 ГБ — GoLang
170 ГБ — Rust
167 ГБ — QA / Тестирование
310 ГБ — 1C + Лицензии
495 ГБ — Машинное обучение
704 ГБ — Аналитика Данных
991 ГБ — Дизайн
Материалы в закрепе, постоянно пополняются👆🏻
Новая подборка open source веб-проектов, которые уже работают в продакшене. Проекты разделены по языкам и фреймворкам: Python/Django, JS/NextJS, Go, PHP и другие.
Можно не только изучать кодовую базу, но и участвовать -> делать баг-репорты, пулл-реквесты или просто смотреть, как устроена архитектура, структура каталогов, CI/CD и другие процессы.
Отличный способ прокачать навыки и посмотреть, как реальные проекты живут в продакшене. 👩💻
👉 @BackendPortal
Ваша софтверная архитектура всегда так же сложна, как и ваша организация
Слышали про Закон Конвея? Это теория, сформулированная компьютерным учёным Мелвином Конвеем в 1967 году. Она гласит:
«Организации, которые проектируют системы, ограничены в своих возможностях создавать дизайны, являющиеся копиями их собственных коммуникационных структур».
В сеть активно выкладывают фото со знаменитостями
Для этого не надо бродить по городу и искать звезд, достаточно освоить нейросеть и делать такие фотки пачками
Все просто: будьте в курсе новостей про ИИ с помощью канала «Ash»
Сейчас нейросети могут написать музыку, создать любую картинку и достать информацию из самых глубин интернета. Глупо пропускать это мимо ушей
Самые актуальные новости здесь: t.me/ashfeeds
Кэшировать или не кэшировать?
Это вопрос, с которым бэкендер сталкивается каждый день.
Большинство инженеров кэшируют слишком много.
Это ленивая инженерия.
Вот небольшой фреймворк, чтобы принимать решение правильно:
I. Данные часто запрашиваются?
II. Их дорого получать?
III. Они изменчивые?
IV. Объём данных большой?
V. Влияет ли это на воспринимаемую пользователем задержку?
VI. Безопасно ли кэшировать?
VII. Есть ли механизм протухания или инвалидации кэша?
👉 @BackendPortal
Консистентность «read-your-writes» означает, что любая запись, сделанная в базу данных, сразу становится доступной для чтения тем же клиентом.
Звучит очевидно, но бывают ситуации, когда это правило не выполняется, особенно при работе на больших масштабах.
На сервере с одной нодой это легко гарантировать при использовании последовательных транзакций.
В среде с primary и replica всё сложнее. Во многих базах данных все записи и часть чтений обрабатываются на primary, а большая часть чтений выполняется на репликах. Из-за задержки репликации может возникнуть ситуация, когда клиент записывает данные в базу и тут же пытается их прочитать с реплики, но записи там ещё нет.
Такое возможно при использовании асинхронной или полусинхронной репликации, так как они не требуют, чтобы все реплики получили данные до ответа клиенту. При синхронной репликации primary отвечает только после того, как все реплики подтвердят получение записи.
Если используется асинхронная или полусинхронная репликация, чтения на реплики лучше направлять только тогда, когда консистентность «read-your-writes» не критична.
👉 @BackendPortal
ПРИМИ УЧАСТИЕ В SMOLATHON 2025 🚀
Любимый многими хакатон возвращается!
16-17 октября 2025 года в Смоленске пройдет масштабный хакатон по созданию цифровых решений для городской среды!
Хакатон проходит в рамках международного молодежного ИТ-форум [Свой код].
[Свой Код] — это новая площадка для молодежи, которой интересны технологии и инновации, которая хочет расти и развиваться профессионально в технологической среде, заинтересована в построении своей карьеры или хочет стать технологическим предпринимателем. В рамках форума предусмотрены развлекательная программа, лекции и мастер-классы, выставка технологий.
На этот раз участникам предстоит разработать веб-платформу для Центра организации дорожного движения Смоленской области.
🚨 Обрати внимание, в этом году хакатон пройдет в два этапа. Прояви себя в отборочном этапе и пройди в финал крутого IT-события осени!
Сохраняй даты:
• Отборочный онлайн-этап: 22 сентября - 3 октября 2025 года
• Очный финал: 16-17 октября для лучших 20 команд
💡 Тебя ждет:
• Решение актуальной задачи для города
• Призовой фонд 500 000 рублей
• Новые знакомства с IT-сообществом
👥 Собери dream team из 2-5 человек и покажи, на что способны настоящие разработчики.
📌 Важно: каждый участник регистрируется индивидуально на сайте https://clck.ru/3PEEAp, а капитан команды отмечает свой статус при регистрации.
Успей зарегистрироваться до 20 сентября 2025 года.
Клиентское кэширование в HTTP работает так
Сервер может отдавать два типа ресурсов — статические и динамические. Статические данные не меняются между запросами, поэтому их можно кэшировать на стороне клиента с помощью специальных HTTP-заголовков.
Когда клиент впервые делает GET-запрос к ресурсу, локальный кэш проверяет его наличие. Если ресурса нет, запрос уходит на сервер. Сервер в ответе указывает, что данные можно закэшировать -> заголовок Cache-Control задаёт время жизни ресурса, а ETag определяет его конкретную версию. Кэш сохраняет ответ и возвращает его клиенту.
При повторном запросе, если ресурс ещё актуален, кэш сразу отдаёт его клиенту, минуя сервер. Однако сервер может обновить ресурс до истечения срока жизни в кеше, поэтому данные в кеше и на сервере не всегда строго согласованы. Обычно это приемлемо, а чтобы гарантировать обновление, сервер просто меняет версию ресурса.
Если ресурс в кеше устарел, кэш отправляет новый запрос на сервер с условным заголовком, например If-None-Match, где указывает сохранённую версию. Если сервер имеет новую версию, он возвращает её. Если изменений не было, он отвечает кодом 304 Not Modified, и клиент продолжает использовать локальные данные.
👉 @BackendPortal
Каждый разработчик в растущем e-commerce сталкивался с этим вопросом:
Как масштабировать процесс создания заказов во время флеш-распродажи?
Есть 4 варианта.
Работает только один.
Разберём по порядку:
I. Синхронное создание заказа
. Запрос блокируется.
. Запись в БД в "горячем" пути.
. Ложится под нагрузкой.
. Не масштабируется.
II. Асинхронная обработка через очередь ✅
. Принимаем заказ.
. Кладём его в очередь.
. Быстро возвращаем ответ.
. Обрабатываем позже.
Это развязывает API и нагрузку:
. Масштабируется.
. Переживает пиковые всплески.
. Даёт контроль.
. Работает, потому что очередь берёт удар на себя.
III. Централизованный сервис заказов
. Один большой сервис.
. Один большой bottleneck.
. Код проще, проблемы те же.
. Разваливается на масштабе.
IV. Сплошные микросервисы
. Вносит задержки, координацию и новые точки отказа.
. Всё ещё не сглаживает пиковую нагрузку.
. Инструмент не для этой задачи.
Компромиссы (они всегда есть):
I. Eventual consistency.
II. Нужна идемпотентность (и так критично).
III. Нужно мониторить состояние очереди.
IV. Требуются компенсирующие транзакции.
V. Очередь сама по себе не решает всё.
👉 @BackendPortal
Как TikTok справляется с миллионами коротких видео в реальном времени?
TikTok использует микросервисную архитектуру, где разные функции (загрузка видео, лента, комментарии, рекомендации) разбиты на независимые сервисы.
Когда вы открываете TikTok, ваш запрос проходит через балансировщики нагрузки и API-шлюзы, которые мгновенно направляют вас к нужному сервису.
Видео хранятся в распределенном облачном хранилище и доставляются через глобальные CDN (Content Delivery Networks). Это обеспечивает быструю загрузку ленты с минимальной буферизацией вне зависимости от вашего местоположения.
Ядро TikTok работает на ключевых сервисах (API). Сервис аутентификации управляет логинами и аккаунтами, сервис профилей пользователей хранит вашу активность, а сервис ленты формирует персонализированный список видео.
Знаменитая «For You Page» работает через сервис рекомендаций, который использует AI и машинное обучение для ранжирования и подбора видео. Отдельный сервис поиска помогает быстро находить тренды и авторов.
За кулисами TikTok обрабатывает огромные объемы данных. Поведение пользователей, лайки, время просмотра и взаимодействия постоянно поступают в модели машинного обучения, чтобы рекомендации обновлялись в реальном времени.
Базы данных специализированы: одни — для аккаунтов пользователей, другие — для метаданных видео, третьи — для аналитики.
Система спроектирована с учетом высокой доступности и отказоустойчивости, что позволяет TikTok работать стабильно даже при сбоях отдельных сервисов.
На глобальном уровне TikTok поддерживает сотни миллионов одновременных пользователей, используя облачную инфраструктуру и распределенные по миру CDN.
Технический стек TikTok:
🔸Frontend: React, Node.js, TypeScript
🔸Backend: Golang, Python, Java, Scala
🔸API-коммуникация: gRPC, GraphQL
🔸Mobile: Swift (iOS), Kotlin (Android)
🔸Базы данных: MySQL, Redis, Cassandra, TiDB
🔸Messaging: Apache Kafka, Pulsar
🔸Обработка данных: Apache Flink, Hadoop, Spark, Hive
🔸Безопасность: собственная IAM, слои шифрования, мониторинг трафика
🔸Хранилище видео: распределенное облако + глобальный CDN (собственный CDN ByteDance)
🔸DevOps: Kubernetes, Docker, Prometheus, Grafana, Chaos Testing
🔸Машинное обучение: TensorFlow, PyTorch, собственные AI-фреймворки ByteDance
Да, CDN снижает задержки за счёт кэширования контента ближе к пользователям, но есть интересная оптимизация, которую они используют, чтобы ещё сильнее уменьшить latency
TCP страдает от slow start -> когда устанавливается новое TCP-соединение, оно сразу не работает на полной пропускной способности. Вместо этого оно стартует консервативно с небольшого количества сегментов и удваивает их каждый RTT, пока не обнаружит перегрузку.
Этот ramp-up может занимать несколько итераций, прежде чем достигнет оптимальной пропускной способности, что проблематично для latency-sensitive приложений. Это серьёзная проблема для CDN, потому что даже несколько лишних RTT на масштабе большого количества пользователей обходятся дорого.
CDN решают это с помощью persistent connection pools к origin-серверам. Вместо того чтобы создавать новое соединение для каждого запроса пользователя, они поддерживают пул долгоживущих соединений между edge-узлами и origin-серверами.
Интересная часть —> это pre-warming в периоды низкой нагрузки.
CDN периодически отправляют небольшие объёмы данных (например, health check или запросы на валидацию кэша) по этим idle-соединениям. Это поддерживает TCP congestion window на максимуме и предотвращает её уменьшение из-за простоя.
Небольшой расчёт, чтобы показать эффект.
Если поддерживать congestion window разогретой, она работает на 64KB вместо 4KB. Это исключает задержку 3–7 RTT, которая возникла бы в противном случае.
Для соединения с RTT 50 мс это экономит 150–350 мс latency - а это очень значимо на масштабе веба.
Надеюсь, вам было интересно. И, как всегда, копайте глубже. 🪰
👉 @BackendPortal
Что такое обработка данных
Обработка данных это сбор, манипулирование и анализ данных для получения полезной информации или инсайтов.
Суть в том, чтобы превращать сырые данные в осмысленную и применимую информацию с помощью разных инструментов, техник и алгоритмов.
Обработка данных бывает разных типов: пакетная (batch), в реальном времени (real-time) и потоковая (stream processing).
В пакетной обработке большие объёмы данных обрабатываются одновременно, обычно ночью или в периоды низкой нагрузки.
В реальном времени данные обрабатываются сразу по мере поступления.
Основные шаги обработки данных:
I. Сбор данных
Первый шаг — собрать данные. Это можно сделать через опросы, сенсоры, веб-скрейпинг или API.
II. Очистка данных
Сырые данные часто содержат ошибки, дубли и пропуски. Очистка данных это поиск и исправление этих проблем, чтобы данные были точными и согласованными.
III. Преобразование данных
После очистки данные нужно привести в формат, удобный для анализа. Это может включать агрегацию данных, конвертацию типов или нормализацию.
IV. Анализ данных
После преобразования данные анализируются с помощью статистики или машинного обучения, чтобы выявить закономерности и инсайты.
V. Визуализация данных
Визуализация это представление обработанных данных в наглядной форме (графики, диаграммы, карты). Это помогает заинтересованным сторонам легко понимать и интерпретировать результаты.
👉 @BackendPortal
За каждой масштабируемой системой стоит очередь. За каждым падением —> неправильно использованная очередь.
Очереди повсюду - фоновые задачи, потоки событий, брокеры сообщений.
Они основа масштабируемых систем, но также и частая причина сбоев.
Базовые определения
I. Очередь: структура данных или система для хранения задач/сообщений в порядке FIFO (First-In-First-Out).
II. Продюсер: компонент, отправляющий сообщения в очередь.
III. Консьюмер: компонент, читающий и обрабатывающий сообщения из очереди.
IV. Брокер: промежуточное ПО для управления очередями (например, RabbitMQ, Kafka, SQS).
V. Подтверждение: сигнал, что сообщение успешно обработано.
VI. Очередь «мёртвых писем» (DLQ): очередь для сообщений, которые не удалось обработать.
VII. Идемпотентность: гарантия, что повторная обработка сообщения не создаст дублирующих побочных эффектов.
VIII. Visibility Timeout: время, в течение которого сообщение «невидимо» для других, пока оно обрабатывается.
Лучшие практики / Подводные камни
I. Используй идемпотентных консьюмеров → предотвращает двойную обработку.
II. Определяй политики повторных попыток (экспоненциальная задержка, ограничение числа попыток).
III. Мониторь длину очереди и задержку обработки как ключевые метрики здоровья.
IV. Используй очереди «мёртвых писем» для упавших сообщений.
V. Гарантируй порядок сообщений только тогда, когда это критично для бизнеса (порядок повышает стоимость и сложность).
VI. Держи сообщения маленькими и самодостаточными.
VII. Всегда включай correlation ID для трассировки.
Производительность
I. Для пропускной способности → параллельные консьюмеры или партиции.
II. Для надёжности → сохраняй сообщения, если критично (компромисс: скорость).
III. Для масштабируемости → авто-масштабирование консьюмеров.
Паттерны
I. Work Queue → распределение задач между воркерами.
II. Pub/Sub → широковещательная рассылка множеству подписчиков.
III. Delayed Queue → повторная попытка позже или планирование задач.
IV. Priority Queue → приоритетная обработка срочных сообщений.
Тесты это не про баги. Это про скорость.
Позвольте объяснить.
Безошибочный код это вымысел.
Но быстрая и бесстрашная итерация? Это реально. И именно для этого нужны тесты.
Хороший набор тестов делает 3 вещи:
- Ломается, когда вы что-то ломаете.
- Объясняет поведение лучше, чем ваши комментарии.
- Даёт уверенность двигаться быстро.
Если работать с кодом страшно, значит, у вас недостаточно тестов или не те тесты.
Тесты это не лишнее.
Вы не пишете их, чтобы угодить менеджеру.
Вы пишете их, чтобы иметь возможность рефакторить без страха.
Скорость это прибыль. Тесты делают скорость безопасной.
👉 @BackendPortal
Охотьтесь на N+1 и убирайте их
Проблема N+1-запросов опасна и легко может ускользнуть из виду. Сценарий такой. Один запрос получает набор данных. Затем для каждой строки нужен ещё один запрос. Количество запросов при загрузке страницы зависит от размера выборки, и если N большой, производительность падает
Пример на псевдокоде
// один запрос
users = db.query('SELECT * FROM users')
// превращается в N дополнительных
for (const user of users) {
posts = db.query(`
SELECT * FROM posts
WHERE user_id = user->id`)
user.posts = posts
}
// только теперь можно вернуть результат
results = await db.query(
`SELECT u.*, p.*
FROM users u
LEFT JOIN posts p
ON u.id = p.user_id`)
Реверс-прокси одновременно играет роль и бэкенда, и фронтенда. Клиенты подключаются к реверс-прокси как к бэкенду, а он в свою очередь подключается к апстрим-бэкендам, уже выступая для них фронтендом.
В обоих направлениях можно использовать разные протоколы. Например, клиенты могут работать по HTTP/1.1, а соединение к бэкенду апгрейдиться до HTTP/2.
В итоге запросы по h1 собираются и идут через один апстримный h2-стрим, или даже h2-h2. Это открывает возможность для довольно интересных архитектур бэкенда. Обрати внимание: NGINX не использует HTTP/2 для апстримов, а HAProxy — использует.
👉 @BackendPortal