backendportal | Unsorted

Telegram-канал backendportal - Backend Portal | Программирование

15708

Присоединяйтесь к нашему каналу и погрузитесь в мир Backend-разработки Связь: @devmangx РКН: https://clck.ru/3FobxK

Subscribe to a channel

Backend Portal | Программирование

Я предпочитаю формат [error, data], а не { error, data } для результатов асинхронных операций. Почему? Потому что кортеж гарантирует порядок. Ошибку ставим первой, чтобы потребитель не забывал о ней. У объекта порядок ключей не важен, и легко пропустить проверку поля error.

Такие мелкие решения в итоге делают API действительно удобным. Если хочешь поощрять обработку ошибок, ставь их вперед. Дай понять потребителю, что они существуют. Сделай так, чтобы проигнорировать ошибку было сложно. 🍦

И именно так и был разработан until-async: https://github.com/kettanaito/until-async

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Терминальный клиент для HTTP / GraphQL / gRPC с поддержкой SSH-туннелей, WebSocket, SSE, workflows, профилирования, OpenAPI и диффов ответов.

https://github.com/unkn0wn-root/resterm

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Сегодня решаю классическую задачу из распределенных систем:

как надежно стримить логи с нескольких реплик в хронологическом порядке?


Неожиданно, но ни один популярный инструмент контейнеризации это нормально не делает.

docker service logs, kubectl logs, stern, kubetail, k9s — все они просто перемешивают стримы в порядке получения. Стандартный костыль — пропустить вывод через | sort 🙃

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

Вот как я решаю это в новой команде uc logs. Требуется две вещи:

1. Low watermark

Отслеживаем минимальный timestamp среди всех стримов и безопасно выводим буферизованные логи, у которых timestamp ниже этого watermark.

watermark = min(latest_timestamp for each stream)
sort and print all buffered logs where timestamp < watermark


2. Heartbeat timestamps

Что если контейнер просто замолчит? Тогда весь вывод зависнет, потому что watermark не будет сдвигаться.

Решение - периодически отправлять пустые heartbeat-записи с текущим timestamp на сервере. Это по сути обещание: "У меня нет логов, которые старше этого времени".

Это позволяет клиенту продвигать watermark без блокировки вывода. На практике интервал 500 мс – 1 сек работает нормально.

Что насчет несинхронизированных системных часов?

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

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

AWS открыл бесплатный доступ к SimuLearn до 6 января!

✓ Реальные симуляции, чтобы прокачать навыки по облакам
✓ Без кредитки и без риска внезапных списаний
✓ EC2, NoSQL, архитектура, траффик под нагрузкой и другое

Один из топовых ресурсов:

ссылка

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Пиковый опыт разработки на TypeScript в бэкенде.

Определяешь маршрут, возвращаешь данные, всё полностью типобезопасно.

Типобезопасность тянется до фронтенда через RPC-подобный коннектор.

Документация по API генерируется для всех ответов.

OpenTelemetry заводится меньше чем за 10 строк.

Живём в интересное время.

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

https://github.com/SaltyAom/elysia-prisma-better-auth-example

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Еще одна книжка на полку. Пятое издание. Подборка статей, собранных Стоунбрейкером, Питером Бейлисом и Джозефом Хеллерстейном. PDF доступен бесплатно.

redbook.io/pdf/redbook-5th-edition.pdf

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Удаляйте ChatGPT. Вы не умеете им пользоваться.

Большинство пользователей спамит в ИИ всякую чушь — просят рассказать анекдот, изливают душу и используют как Гугл.

Российский тимлид OpenAI Вадим Петрич рассказывает в «Доктор GPT» как извлекать из нейронок максимум пользы. Это очень интересно:

• ТОП №1 нейросеть, генерирующая видео без цензуры вообще
• Готовые промты на все случаи жизни
• Инсайды и разработки от китов индустрии

Подпишитесь, с Доктором GPT нейронки станут инструментом роста, а не безделушкой:
/channel/+K65EHRh_x_c2OTli

Читать полностью…

Backend Portal | Программирование

Почему JSON жрет твой CPU

Твой API тупит. Ты думаешь что база медленная, сеть лагает. Но реальная пробка может быть в том формате, на котором всё общается.

JSON это не формат данных. Это текст.

Каждый раз, когда ты отправляешь {"id": 12345}, сервер платит скрытый "налог на парсинг". Даже самые быстрые парсеры вроде simdjson упираются в аппаратные ограничения, которых у бинарных форматов просто нет.

Разложим по технике.

1. Цена на CPU (state-machine против арифметики)

JSON (текст):

Чтобы прочитать число 12345, CPU получает сырые байты. Даже оптимизированный парсер должен пройти через state machine:

- искать структурные символы (: , { }).
- проверять escape-последовательности.
- а потом конвертировать строку в число:
цикл: взять char, вычесть '0', умножить накопленное на 10, прибавить.

Это прыжки в ветках, пропуски кеша, ситуации, где CPU просто ждет.

Protobuf (бинарный):

Отправляет Varint (для маленьких чисел) или фиксированный формат.

fixed32 => просто memcpy. Никакого парсинга.

Varint => читаешь байт, смотришь флаг в старшем бите (MSB), решаешь, идет ли число дальше.

Результат: несколько битовых операций. На нагрузках с большим количеством чисел бинарный формат фундаментально быстрее.

2. Стоимость по сети (энтропия против повторов)

JSON:

[
{"status": "active"},
{"status": "active"}
]


Ты передаешь ключ "status" снова и снова.

Контраргумент:

gzip всё решит!


Ответ:

gzip решает сеть, но ест CPU.


Тебе нужно:

Serialize JSON → Compress → Send
и у получателя наоборот: Receive → Decompress → Parse JSON.

Ты сжимаешь текст, который вообще не должен повторяться.

Protobuf:

Схема отдельно, данные отдельно. На проводе вместо "status" просто ID поля. [Tag: 1][Value: "active"]. Сжатие уже почти ненужно —> полезной нагрузки меньше.

3. Цена надежности (Schema-on-Read)

JSON это "схема при чтении". Ты получаешь кусок текста и надеешься, что id правда число. В итоге:

if (typeof id !== 'number') ...
или тащишь валидатор вроде Zod/Pydantic, что снова жрет CPU.

Protobuf — "схема при записи".

Контракт жесткий = типы известны заранее, и на границе сериализации ты получаешь гарантии. Валидация есть, но намного дешевле.

JSON удобен для публичных API, потому что читаемый и дружелюбный.

Но в высоконагруженных микросервисах JSON это налог. Ты тратишь железо, чтобы каждый раз разбирать текст.

gRPC/Protobuf это не сверхчудо. Ты просто переносишь сложность с рантайма (парсинг текста) в билд-стадию (генерация кода).

И CPU говорит спасибо. 🥰

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Ты правильно используешь Docker.?

Вот две вещи, которые СКОРЕЕ ВСЕГО ты упускаешь:

• У тебя Dockerfile в один stage. Это медленно.
• Ты почти не используешь кэширование слоев. Это тоже медленно.

Уже несколько лет Docker по умолчанию использует BuildKit как основной движок, и он поддерживает multi-stage Dockerfile.

Суть такая:
Обычный single-stage Dockerfile (скорее всего, у тебя как раз такой) заставляет каждый шаг зависеть от предыдущего.

Это значит:
• Все шаги выполняются строго последовательно
• Итоговый образ раздувается
• Любое изменение ломает кэш следующих слоев
• Нет шансов что-то реально распараллелить

Меняешь одну строку в начале Dockerfile = все слои после нее идут мимо кэша.

Есть вариант получше:

Начни использовать multi-stage сборки.

Парень записал видео, где сравниваю медленную single-stage сборку и быструю multi-stage.

Что нужно сделать:

Разбей Dockerfile на независимые стадии с помощью нескольких FROM. BuildKit построит граф зависимостей и будет гонять независимые стадии параллельно.

Плюсы тут такие:

Сборка станет намного быстрее. Параллельные стадии реально экономят кучу времени.

Кэширование будет намного эффективнее. У каждого stage свой набор слоев. Если что-то изменилось в build-стейдже, финальный stage не инвалидируется.

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

Для меня это стало огромным апгрейдом того, как я пишу Dockerfile.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Proxmox 9.1 теперь нативно поддерживает OCI-образы (Docker)

Proxmox VE 9.1 теперь поддерживает OCI-контейнеры на базе LXC, использует ядро Linux 6.17 и содержит улучшения в области виртуализации, безопасности и сетевых функций

Подробнее здесь

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

С UUIDv7 в PostgreSQL 18 сортировка через ORDER BY теперь реально выдаёт записи в порядке их создания.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Хочешь избежать проблем, когда Cloudflare падает?

Или когда La Liga блокирует твои страницы?

Разработчик сделал open-source CLI, чтобы можно было легко отключать этот сервис в проектах за пару секунд.

$ npx disable-cloudflare@latest


👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

25 золотых правил системного дизайна

1. Система с упором на чтение
> Используй кэш (Redis/Memcached) для частых запросов вроде профилей пользователей

2. Низкая задержка
> Используй кэш и CDN (Cloudflare), чтобы раздавать статику ближе к пользователю

3. Система с упором на запись
> Используй Message Queue (Kafka) для буферизации большого объема записей (логи, аналитика)

4. ACID-требования
> Используй SQL (PostgreSQL) для строгих транзакций вроде банковских операций

5. Неструктурированные данные
> Используй NoSQL (MongoDB) для гибких схем, например каталогов товаров

6. Сложные медиа-ресурсы
> Используй Blob Storage (AWS S3) для видео, изображений и больших файлов

7. Сложные предварительные расчёты
> Используй Message Queue + Cache для асинхронной генерации контента (например ленты новостей)

8. Поиск при больших объемах данных
> Используй Elasticsearch для полнотекстового поиска и автокомплита

9. Масштабирование SQL
> Используй шардирование, чтобы разделить большие таблицы на несколько инстансов

10. Высокая доступность
> Используй Load Balancer (NGINX) чтобы распределять трафик и избегать перегрузки

11. Глобальная доставка данных
> Используй CDN для стабильного стриминга и раздачи контента по всему миру

12. Графовые данные
> Используй Graph DB (Neo4j) для соцсетей, рекомендаций и связей между сущностями

13. Масштабирование компонентов
> Используй горизонтальное масштабирование, а не просто апгрейд железа

14. Быстрые запросы к базе
> Используй индексы на ключевых колонках вроде email или user_id

15. Пакетные задачи
> Используй Batch Processing для отчётов, расчётов или периодических задач

16. Защита от злоупотреблений
> Используй Rate Limiter, чтобы предотвращать DDoS и спам запросов к API

17. Доступ к микросервисам
> Используй API Gateway для авторизации, маршрутизации и SSL-терминации

18. Единая точка отказа
> Добавляй Redundancy (Active-Passive), чтобы сервис продолжал работать при сбоях

19. Отказоустойчивость данных
> Используй репликацию (Master-Slave), чтобы данные не терялись при падении узлов

20. Реальное время
> Используй WebSockets для чатов, лайв-обновлений, лайв-результатов

21. Обнаружение сбоев
> Используй Heartbeat-пинг, чтобы проверять статус сервисов каждые несколько секунд

22. Целостность данных
> Используй Checksums (MD5/SHA) чтобы проверить, что загруженные файлы не повреждены

23. Децентрализованное состояние
> Используй Gossip Protocol, чтобы ноды обменивались статусами без центрального сервера

24. Эффективное кеширование
> Используй Consistent Hashing, чтобы добавлять или убирать кэш-ноды без полного пересчёта ключей

25. Работа с геоданными
> Используй Quadtree или Geohash для быстрых запросов вроде поиска ближайших водителей


👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Случайные UUID заметно просаживают производительность базы

Ты перешел с integer ID (1, 2, 3…) на UUID (a1b2-3c4d-…) ради безопасности или распределенной генерации.

И вдруг вставки стали медленнее. Иногда намного.

Причина простая - фрагментация индекса.

Большинство индексов в базах данных это B-деревья (сбалансированные сортированные структуры). Физическое расположение данных в индексе реально важно.

Последовательные ID

Когда ты вставляешь последовательные целые числа (1, 2, 3), новые записи всегда попадают в правую страницу листа индекса.

Все максимально предсказуемо:

- записи идут последовательно
- кэш работает эффективно
- страницы заполняются полностью

Это почти максимальная скорость, на которую способна твоя база.

Случайные UUIDv4

UUIDv4 генерируются равномерно случайно. Вставка может попасть в любое место структуры B-дерева.

Из-за хаотичного распределения:

База должна постоянно подгружать случайные страницы с диска в память. Это random I/O.

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

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

Когда размер индекса превышает доступную оперативку, пропускная способность записи может просесть на 20–90%.

UUIDv7

Хватит использовать UUIDv4 в качестве primary key. Переходи на UUIDv7 (стандарт RFC 9562).

UUIDv7 содержит timestamp в начале, так что значения становятся сортируемыми.

Что это дает:

Генерация без центрального счетчика

Вставки идут монотонно, почти как обычные последовательные числа

Фрагментация индекса исчезает

Защита от угадывания ID (хотя по ID можно понять время вставки)

Получается удобство UUID, но без потерь по производительности.

Короче, UUIDv7 норм. UUIDv4 не особо, если используешь как primary key.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Большинство споров про Docker рано или поздно приходят к одному вопросу: slim или alpine, какой базовый образ выбрать?

Alpine очень маленький, выглядит привлекательно, если хочется сильно урезать размер образа. Но он использует musl вместо glibc, поэтому некоторые приложения ведут себя иначе, часть библиотек работает криво, а отладка может превратиться

Хороший вариант, если у тебя простое приложение или статический бинарник без кучи зависимостей на уровне ОС.
Slim-образы, вроде debian:slim или node:22-slim, больше Alpine, но всё ещё намного легче полноценных системных образов.

Они используют glibc, так что большинство тулов и библиотек работает нормально.
Обычно это означает меньше сюрпризов в проде, проще дебаг и лучше совместимость с документацией и примерами в сети.

Для большинства веб-приложений, API и инструментов slim = более безопасный выбор по умолчанию. Размер образа всё ещё небольшой, скачивается быстро, безопасность ок, и при этом не приходится ловить странные баги, связанные с musl.

Alpine имеет смысл, если ты:

поставляешь один статический бинарник
хорошо понимаешь свои зависимости
готов разруливать совместимость, если что-то поедет боком


👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Так что я, как обычно, копался в Docker и узнал, насколько круто у него работает сеть.

Когда создаешь контейнер, он по умолчанию использует bridge-сеть, и контейнер получает приватный IP через встроенный IPAM (IP Address Management) драйвер автоматически.

Но можно создать свою кастомную bridge-сеть (user-defined network), и тогда контейнеры смогут общаться по имени, если они в одной сети. В дефолтной bridge-сети контейнеры могут общаться только по IP.

Я попробовал собрать простую небольшую продакшн-эмуляцию, чтобы лучше разобраться. Там четыре контейнера: API-сервер, веб-фронтенд, база данных и reverse-proxy. И три bridge-сети: database, backend и frontend.

API-сервер подключен к database и backend сетям, а nginx-proxy подключен к frontend и backend, потому что ему нужно прокидывать трафик между портами. Контейнеры в одной сети могут пинговать друг друга, остальные — нет, пока ты явно не подключишь их к нужным сетям.

Сеть database изолирована и без доступа в интернет с флагом --internal. Это удобный способ защитить базу. Контейнеры внутри этой сети могут общаться друг с другом, но доступа наружу у них нет.

Остальные контейнеры получают доступ в интернет классическим способом - у каждого свой приватный IP, и они подключены к docker0 через veth-пары (виртуальные Ethernet-интерфейсы). docker0 работает как виртуальный свитч, который отвечает за маршрутизацию трафика между контейнерами и сетью хоста. Это выглядит круто, потому что фактически имитирует интернет в миниатюре, только вместо физических устройств тут контейнеры.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

TLS termination звучит просто, но это один из ключевых элементов современной инфраструктуры.

Вместо того, чтобы каждый бэкенд сам занимался шифрованием и расшифровкой, всю TLS-нагрузку берет на себя балансировщик на границе сети.

Когда клиент подключается, TLS-handshake происходит между браузером и балансировщиком. Балансировщик использует свой сертификат, устанавливает защищенный канал и расшифровывает входящий HTTPS-трафик.

Дальше он общается с бэкендами уже по обычному HTTP внутри приватной сети.

В результате сервера приложений не тратят CPU на криптографию, им не нужны сертификаты, и они занимаются только бизнес-логикой.

Плюс обновление сертификатов становится проще — все лежит в одном месте, а не разбросано по десятку сервисов.

Важно помнить:

незашифрованный трафик живет только внутри доверенной внутренней сети. Снаружи все остается зашифрованным до самого балансировщика.


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

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Короткая заметка про k8s:

Оказалось, что можно настраивать лимиты пропускной способности для пода или деплоймента. По умолчанию эта фича отключена. Но входящий и исходящий трафик можно контролировать через аннотации на поде, примерно так 😃

Кстати: M это Mbps, G это Gbps.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Одна простая привычка, которая сильно упрощает поддержку Dockerfile, это сортировка многострочных списков пакетов по алфавиту.

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

Когда ставишь пакеты в многострочном apt-get install или apk add блоке, легко случайно добавить дубликат или пропустить что-то, что затерялось в середине списка.

Алфавитная сортировка полностью снимает этот вопрос. Список можно быстро просканировать, сразу увидеть дубли и держать всё в едином стиле на разных окружениях.

Плюс уменьшаются шумные диффы в код-ревью.

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

Без сортировки маленькое обновление часто превращается в огромный diff, и ревью становится сложнее, чем должно быть.

Этот подход особенно полезен, когда команда растёт.

Несколько человек, трогающих один Dockerfile, не начинают перетасовывать строки под свой вкус или форматировать по-разному.

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

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

💧 А вы заметили, насколько сейчас сложнее устроиться на работу?

Да даже получать приглашение на техническое собеседование.

К примеру, на хх.ру при нормальном резюме после 100 откликов — ты должен получить минимум 4 приглашения от эйчар.

Если у вас меньше, то тут что-то не чисто.

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

Один мой знакомый недавно проводил эксперимент на эту тему:

Он выложил вакансии на 3 разные позиции и посмотрел на всё это дело глазами HR, разобрал резюме кандидатов, а затем выложил ролик на свой ют канал.

Его зовут Вадим Новоселов - один из немногих, кто показывает рынок трудоустройства в IT изнутри.

В тг канале много авторского контента:

(тут) можно оставить своё резюме для прожарки на предстоящем стриме

(тут) гайд по трудоустройству за 3-4 месяца

(тут) подкаст о том, что будет с рынком айти в рф

Этот человек вкладывает душу в свой контент и проекты, советую подписаться и черпать для себя полезные фишки: @gernar288

Читать полностью…

Backend Portal | Программирование

Совет: всегда добавляй workflow_dispatch в триггеры workflow.

Так у тебя появится кнопка в UI GitHub, чтобы вручную запускать новые прогонки (когда CI, как обычно, развалится).

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Сообщество разработчиков объявило о выходе экспериментального CRDT-расширения для Postgres. Проект открыт и доступен для изучения и использования.

CRDT это тип данных, который применяется в приложениях с одновременным редактированием. Простой пример — Google Docs, где несколько пользователей могут печатать одновременно, а изменения автоматически объединяются без конфликтов.

Обычно такие структуры сериализуются на стороне сервера и только потом сохраняются в базу. Новое расширение меняет подход: теперь Postgres может работать с CRDT нативно — хранить, индексировать, искать и автоматически объединять изменения прямо в базе данных.

Авторы проекта показывают, как это может выглядеть в будущем:

create table blog_posts (
id uuid primary key,
title text,
body crdt default '{}'
);


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

Также предполагается поддержка WebSockets для быстрого обмена изменениями между клиентами и последующей отправки батчей в Postgres.

Проект может стать важным шагом для приложений реального времени, совместного редактирования контента и распределённых систем.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Небольшая новость для тех, кто работает с PostgreSQL.

У Postgres есть официальное расширение для VS Code. Можно работать с базой прямо в редакторе без лишних тулз и переключений.

Что внутри:

- Визуализация схемы
- Поддержка агентов для взаимодействия с базой
- Метрики, аналитика и мониторинг
- Быстрый запуск PostgreSQL в Docker, если нужно локальное окружение
- Умный IntelliSense с учётом контекста базы: автодополнение, форматирование, подсветка синтаксиса

И это только основные фишки.
Кому интересно, вот расширение: тык

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Диграмма микросервисной архитектуры и связанных с ней паттернов

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

В новой статье на Хабре Алексей Кременьков, бэкенд-разработчик в Яндекс 360, рассказывает о создании и эволюции сервиса динамического шардирования Sharpei для масштабирования PostgreSQL под нагрузкой в 300К+ RPS.

Пошагово разберём, как:

• Создали собственный инструмент для управления 700+ шардами PostgreSQL
• Справились с пиковыми нагрузками при миграциях
• Автоматизировали перенос пользователей между шардами и переехали в облако без даунтайма

Сервис Sharpei позволил Яндекс Почте перейти к гибкому горизонтальному масштабированию, полностью автоматизировать управление шардами и добиться четырёх девяток отказоустойчивости.

↘️ Подробнее читайте на Хабре

Читать полностью…

Backend Portal | Программирование

12 рекомендаций по дизайну API для бэкенд-разработчиков

(Их часто спрашивают на собеседованиях)

1. Понятные имена ресурсов

❌`GET /get-all-orders`  
✅`GET /orders`


2. Корректное использование HTTP-методов

- POST /users — создать пользователя
- GET /users/123 — получить пользователя
- PUT /users/123 — заменить полностью
- DELETE /users/123 — удалить

3. Идемпотентность

Клиент отправляет:

POST /payments
Idempotency-Key: abc-123


Если запрос повторится, сервер должен вернуть тот же результат, не создавая операцию заново.

4. Версионирование API

Рекомендуемый вариант — в URL:

GET /v1/products/42
GET /v2/products/42


5. Правильные статус-коды

Если пользователь не найден:

❌ `200 OK { "error": "user not found" }`  
✅ `404 Not Found`


6. Пагинация

Пример:

GET /articles?page=2&limit=50


Ответ должен содержать элементы 51–100.

7. Фильтрация и сортировка

Пример:

GET /orders?status=shipped&sort=-created_at


8. Безопасность

Использование JWT в заголовках:

Authorization: Bearer <token>


9. Rate limiting

Например: 100 запросов в минуту.
После превышения — вернуть:

429 Too Many Requests


10. Кэширование

Запрос:

GET /blog/posts/123


Ответ содержит:

ETag: "abc"


Повторный запрос:

If-None-Match: "abc"


Если не изменилось — 304 Not Modified.

11. Документация

Используй:

- Swagger UI
- OpenAPI

Разработчики должны видеть схемы, параметры и иметь возможность тестировать запросы.

12. Быть прагматичным

Иногда лучше так:

POST /auth/login


чем строго REST-подход:

POST /sessions


Хороший API читается как логичная, предсказуемая система и экономит время всем, кто с ним работает.

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Если честно, я всё чаще замечаю, что бэкенд-сообщество – невероятно разное. Здесь есть и те, кто только начинает разбираться в сервисах и базах, и те, кто уже пишет такие системы, которые держат на себе половину интернета. Но есть одна общая черта: хороших бэкендеров формирует не только практика, но и среда, в которой они находятся.

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

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

Если вы работаете с бэкендом, то скорее всего, найдёте там что-то ценное для себя: идеи, подходы, вдохновение или даже ответы на вопросы, которые давно крутились в голове.

Хорошая среда делает нас сильнее 😎

Читать полностью…

Backend Portal | Программирование

SQL + SELECT = выбор данных
SQL + JOIN = объединение данных
SQL + WHERE = фильтрация
SQL + GROUP BY = агрегация
SQL + ORDER BY = сортировка
SQL + UNION = объединение запросов
SQL + INSERT = добавление записей
SQL + UPDATE = изменение данных
SQL + DELETE = удаление записей
SQL + CREATE TABLE = проектирование структуры
SQL + ALTER TABLE = изменение схемы
SQL + DROP TABLE = удаление таблицы
SQL + INDEX = ускорение запросов
SQL + VIEW = виртуальные таблицы
SQL + подзапросы = вложенные запросы
SQL + хранимые процедуры = автоматизация задач
SQL + триггеры = автоматические реакции на события
SQL + CTE = рекурсивные запросы
SQL + оконные функции = продвинутая аналитика
SQL + транзакции = целостность данных
SQL + ACID = надежные операции
SQL + хранилища данных = работа с большими объёмами
SQL + ETL = преобразование данных
SQL + партиционирование = работа с большими таблицами
SQL + репликация = высокая доступность
SQL + шардинг = масштабирование базы
SQL + JSON = полуструктурированные данные
SQL + XML = структурированные данные
SQL + безопасность данных = защита информации
SQL + оптимизация запросов = повышение производительности
SQL + управление данными = контроль качества данных


👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Вопрос:

try {
call_order_service();
call_inventory_service(); // уменьшаем остатки
} catch (Exception e) {
// лол, и что теперь? Заказ уже создан.
}


Поздравляю. У тебя есть заказ на товар, которого нет на складе.

И как ты это будешь фиксить?

👉 @BackendPortal

Читать полностью…

Backend Portal | Программирование

Разработчик ускорил загрузку сайта при работе в браузере ladybird почти в три раза. Время рендера сократилось примерно с одной секунды до четырёхсот миллисекунд.

Оптимизация получилась за счёт двух изменений:

- в HTTP-кеш добавили поддержку heuristic freshness lifetime в соответствии с RFC 9110 и 9111

- рендер теперь стартует только после получения всех CSS-импортов, так что эффект FOUC больше не появляется

👉 @BackendPortal

Читать полностью…
Subscribe to a channel