15708
Присоединяйтесь к нашему каналу и погрузитесь в мир Backend-разработки Связь: @devmangx РКН: https://clck.ru/3FobxK
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
Разработчик выложил проект ShadowStream, систему отслеживания изменений в базе данных (CDC), построенную на PostgreSQL logical replication.
Цель проекта — ловить любые изменения в реальном времени и передавать их в потоковую инфраструктуру.
Как это работает:
- изменения в базе (INSERT, UPDATE, DELETE) сразу перехватываются через logical replication
- события сериализуются в Protobuf и отправляются в Redis Streams для быстрого доступа
- параллельно те же данные архивируются в Kafka для надежного хранения
- Kafka использует grouped consumer'ов: два обработчика работают параллельно, плюс резервная группа с отдельным offset
- поверх всего в Django Admin добавлена визуализация gRPC-вызовов
Исходники открыты на GitHub
Проект может пригодиться тем, кто работает с потоковой обработкой данных, аналитикой, репликацией или интеграцией микросервисов. 🙂
👉 @BackendPortal
Курс по git на русском прямо в браузере
Проходишь шаги от базовых команд до веток и коммитов, всё через практику.
👉 @BackendPortal
Изоляция рунета ближе, чем ты думаешь
Loading …
██████████████] 99%
Бэкпрешер — ключевая вещь для нормально работающей инфраструктуры.
Когда базы данных, очереди сообщений, коннекшн-пулы и другие системы начинают захлёбываться от нагрузки, как они с этим справляются?
Некоторые продукты просто дают ресурсам выгореть до нуля и в итоге падают в креш или фейл-состояние (OOM и так далее). Реализовать такое поведение проще всего, но дальше начинаются каскадные проблемы, которые могут уложить всю систему и даже привести к потере данных. Так себе вариант.
Подход получше — когда каждый компонент сам отдаёт бэкпрешер своим клиентам. Смысл в том, что если сервис видит, что работает на пределе (лимит подключений, забиты все буферы памяти и прочее), он сообщает об этом клиентам: через явные сигналы или, например, отклоняя новые подключения. То есть он сохраняет своё здоровье ценой того, что часть запросов будет замедлена или отклонена.
Если бэкенды спроектированы так, чтобы уважать сигналы бэкпрешера, внезапные пиковые нагрузки приводят только к деградации производительности, а не выключают всю систему целиком.
👉 @BackendPortal
Go-разработчики обсуждают экспериментальный акторный рантайм, через который прогнали 10 млн сообщений и получили около 30 млн операций в секунду. Проект пока не готов для продакшена, но показал, что базовый паттерн работает эффективно.
Автор использует классическую акторную модель, естественно ложащуюся на примитивы Go - - одна горутина владеет своим состоянием, взаимодействие идёт исключительно через канал сообщений. Это позволяет обойтись без локов и исключить доступ к общему мутируемому состоянию.
Схема проста:
один актор = горутина + mailbox, состояния — приватные, остальная программа общается только через Send(msg), а сам актор крутится в цикле обработки входящих сообщений.
https://github.com/anthdm/hollywood
👉 @BackendPortal
Крыса следит за твоими эндпоинтами, чтобы тебе не пришлось 🐁
statui — TUI-дашборд для проверки здоровья API.
Следи за эндпоинтами, латентностью и фейлами в реальном времени прямо из терминала.
Написан на Rust и собран с помощью ratatui
Тестим здесь: https://github.com/Mohamed-Badry/statui
👉 @BackendPortal
Анатомия фрейма WebSockets
Максимальный размер заголовка всего 14 байт, что делает WebSockets более эффективным для двунаправленных сценариев (например, чаты, игры) по сравнению с long polling, где есть накладные расходы из-за HTTP-заголовков.
Максимальный размер сообщения может достигать 2^63 байт.
Разумеется, поскольку WebSockets работает поверх TCP, мы сталкиваемся с проблемой head-of-line blocking.
👉 @BackendPortal
Добавление индексов критично для производительности базы, но не всегда есть смысл индексировать вообще все строки.
Используй частичный индекс. Он даёт более быстрые запросы по сравнению с обычным индексом и при этом экономит место на диске.
Отлично подходит для случаев, когда ты постоянно делаешь запросы с одним и тем же WHERE.
👉 @BackendPortal
⚡️ ВАЙБ-КОДИНГ теперь в Telegram!
Ребята сделали крутейший канал, где на наглядных примерах и понятном языке рассказывают как войти в новую эру разработки с ИИ, делятся полезными фишками и инструментами
Подписывайтесь: @vibecoding_tg
Ты реально можешь превратить свой терминал в текстовый редактор.
Есть open-source тулза под названием Fresh. Ставишь один npm-пакет, запускаешь команду fresh и твой терминал мгновенно превращается в современный редактор.
Можно открывать файлы.
Редактировать папки.
Использовать командную палитру.
И даже получать фичи, очень похожие на VS Code, но прямо внутри окна терминала.
Проект просто дикий. Об этом явно должны знать больше людей.
Пользуемся
👉 @BackendPortal
DDD — это концепция, которую я часто вижу недооценённой, хотя по моему опыту она оказалась реально полезной.
Часто, когда говорят про DDD, сразу думают про bounded contexts, aggregates, сущности, value objects.
И это нормально. Но я считаю, что сердце DDD не в архитектуре, а в языке.
Единый (Ubiquitous) язык — это не красивый словарик и не набор умных терминов.
Это семантическое соглашение между бизнесом и технологиями.
Живой контракт, который определяет, как мы думаем, как называем вещи и как решаем проблемы.
Что такое Единый язык на самом деле
Это набор слов, понятий и правил, которые вся команда использует для описания домена.
Не в теории, не на стикерах, а в коде, в разговорах и в документации.
Например:
Если бизнес говорит «подписка», а в коде у тебя «membership».
Если бизнес говорит «фактическая отмена», а в коде используется «softDelete».
Если бизнес различает «клиента» и «потребителя», а в модели у тебя везде просто «User».
Значит, у тебя нет Единого языка.
У тебя есть ментальные переводы, путаница для всех, кто не технарь, куча неоднозначностей, и эти проблемы коммуникации рано или поздно превращаются в баги.
Как ни крути, софт — это отражение бизнеса.
Если язык в коде не совпадает с тем, как мыслит бизнес, ты увеличиваешь риск построить систему, которая не отражает реальность.
А когда реальность не совпадает с кодом, ты получаешь продукт, который может не соответствовать исходным ожиданиям.
Единый язык как раз и пытается убрать этот разрыв.
Он делает так, чтобы домен существовал и в голове у бизнес-эксперта, и в твоём редакторе кода.
Как это выглядит в реальном проекте
Например, если бизнес говорит:
«Заказ может перейти в статус “Одобрен”, только если платёж подтверждён».
Твоя модель должна отражать это напрямую:
order.approve(paymentConfirmation);
order.validate();
order.setStatus(3);
Когда между идеей и продом — преград нет!
В VK любят решать сложные и масштабные задачи, а ещё — быстро реализовывать идеи. Компания рассказала, каких принципов придерживается команда в работе и какими результатами гордится. Переходите по ссылке, там много интересного!
Практический Docker Roadmap
Она включает более 50 практических заданий, дополненных десятками визуальных разборов и несколькими теоретическими глубокими погружениями. На данный момент вы можете изучить:
- Как запускать разные типы контейнеров (веб-приложения, CLI-утилиты, базы данных и т.д.)
- Как перечислять, инспектировать и управлять локальными контейнерами
- Как выполнять команды внутри контейнеров и отлаживать простые проблемы
- Как обновлять контейнерные образы для stateless и stateful приложений
- Как собирать контейнерные образы как профи
...и несколько других тем
https://labs.iximiuz.com/roadmaps/docker
👉 @BackendPortal
Проверяет наличие электронной почты без отправки письма.
https://github.com/reacherhq/check-if-email-exists/
👉 @BackendPortal
Представь, ты стримишь изменения из Postgres в Elasticsearch на Go. В деве всё работает стабильно. Потом растёт трафик, и внезапно сервис перестаёт вывозить…
Профилируешь и упираешься в JSON-сериализацию.
Каждый документ, который уходит в Elasticsearch, нужно закодировать. Когда событий тысячи в секунду, эти микросекунды начинают быстро накапливаться. Стандартная encoding/json удобная, но она сильно завязана на рефлексии.
Рефлексия удобна, потому что универсальна, но за неё платишь скоростью. Это почти всегда медленнее, чем когда структура известна на этапе компиляции.
И да, в любом языке почти никогда нет “одной библиотеки на задачу”. Люди постоянно переписывают одно и то же, и нередко делают быстрее, чем дефолт из коробки.
Так что вместо стандартной encoding/json можно взять пакет jsoniter. По бенчмаркам: декодирование среднего payload у стандартной либы занимает 35 510 ns/op и делает 99 аллокаций. У jsoniter это 5 623 ns/op и всего 3 аллокации. То есть больше чем в 6 раз быстрее и на 97% меньше аллокаций.
Дичь.
Это не значит, что надо срочно переписывать код. Но если у тебя JSON-сериализация в топе на пламеграфе :) переход на jsoniter (или на то, что в текущий момент самое эффективное) может дать ощутимый прирост
И такое есть вообще в каждом языке и почти под любую работу. Пусть этот пост будет напоминалкой: иногда стоит смотреть дальше дефолтов :)
Надеюсь, пригодится. 👍
👉 @BackendPortal
Акторная модель это, по сути, подход, где между процессами/потоками (или акторами) нет общей памяти.
Разные акторы общаются, передавая сообщения. Каждый актор владеет своим состоянием, обрабатывает по одному сообщению за раз и общается с другими только через асинхронные сообщения. Локов нет.
Rust красиво ложится на это через один только трейт Send в трейте актора.
Send означает, что актора можно безопасно перемещать в другой поток. Sync не нужен, потому что ссылка на актора никогда не шарится между потоками. К актору всегда имеет доступ только один поток, и это убирает гонки данных на этапе компиляции.
👉 @BackendPortal
Этот инструмент экономит время на ручном прописывании API.
Вставляешь JSON — на выходе сразу получаешь TypeScript-код.
→ http://app.quicktype.io
👉 @BackendPortal
Команды lsof в Linux, которые реально экономят девопсам часы отладки:
🔸Кто держит порт
lsof -i :5000
lsof -i
lsof -u username
lsof -p 1234
lsof /var/log/syslog
lsof -i TCP
lsof -i UDP
lsof -c nginx
lsof | grep deleted
lsof -i 4
lsof +D /var/log
lsof -i -r 2
lsof -u root -i TCP:80
Заказчик кинул с деньгами? Отправьте его в суд.
Чаще из-за ошибок в договоре правда может быть не на вашей стороне. 8 пунктов для безопасного договора — проверьте прямо сейчас.
В 2026 году требования к IT-компаниям и фрилансерам станут жёстче. Разберитесь с налогами, сайтами и договорами уже сейчас.
Подписывайтесь на LAWLEGKO — канал практикующего юриста Инны Вялковой. Новости от государства и юридические тонкости простым языком.
Или передайте всё юристам: договоры, налоги, реклама — юридическое абонентское сопровождение.
Вы занимаетесь работой, юристы LAWLEGKO — вашим спокойствием.
Подожди, так есть децентрализованная альтернатива GitHub? 😲😲😲
Проект называется Tangled, и его идея в том, чтобы дать тебе полное владение своим кодом, без привязки к центральной платформе.
Можно поднять свои репы через лёгкие узлы knot, либо воспользоваться их управляемым узлом, если не хочется заморачиваться с хостингом.
Функционал привычный: git-воркфлоу, issues, pull requests, комментарии. Но при этом ты контролируешь инфраструктуру и данные.
Если когда-то хотелось GitHub-опыт без единого провайдера сверху, стоит глянуть.
ЗАТЕСТИТЬ
👉 @BackendPortal
Интерактивный гайд о шардировании баз данных, как это работает для реляционных баз.
Каждому инженеру стоит понимать базовые принципы и основные сложности шардирования. Эта статья как раз про это и предназначена.
Читаем здесь
👉 @BackendPortal
Вот так обычно выглядит мой эндпоинт /health
👉 @BackendPortal
freeCodeCamp выкатили бесплатный курс по Git и GitHub для новичков. За 1 час разберёшь базу: ветки, слияния, pull request’ы и базовую командную работу. Отличный быстрый вход для тех, кто откладывал Git «на потом».
Git-курс тут
👉 @BackendPortal
Одна вещь, о которой почти каждый из нас задумывается в какой-то момент карьеры в техе:
Лучше быть дженералистом?
Или лучше быть специалистом?
Правда в том, что ни одна из этих позиций, доведённая до крайности, нормально не работает в реальных командах.
Быть только дженералистом может быть опасно: ты знаешь по чуть-чуть про всё, но не можешь копнуть глубже там, где это реально важно.
Быть только специалистом тоже риск: ты держишь одну область с хирургической точностью, но слишком зависишь от команды во всём остальном.
Вот тут как раз появляется концепция T-образного профиля.
Что такое T-образный профиль?
Буква T описывает две оси.
Горизонтальная перекладина.
Широкий кругозор. Скиллы, которые позволяют тебе ходить по разным областям и не стопориться.
Знать достаточно про frontend, devops, тестирование, архитектуру, базы данных и так далее.
Вертикальная ножка.
Глубина в какой-то конкретной области.
Твоя специализация: например Java, безопасность, базы данных, оптимизация, cloud, предметная область и так далее.
T-образный профиль комбинирует оба измерения.
Достаточная широта, чтобы работать в команде.
Реальная глубина, чтобы давать ощутимую добавочную ценность.
Почему это вообще так важно?
Потому что сейчас системы сложные.
Есть микросервисы, которые завязаны на пайплайны.
Есть frontend, который влияет на решения в backend.
Есть архитектура данных, которая влияет на каждую фичу.
Есть инфраструктурные решения, которые меняют дизайн.
Разработчик, который знает только своё, очень быстро выпадает из общего контекста.
А разработчик, который по верхам про всё, в итоге почти ни на что важное не влияет.
T-образный профиль это как раз точка баланса.
Как T-образный профиль выглядит на практике?
Чистый дженералист говорит:
Я умею пользоваться Spring, NestJS, GitHub Actions, Docker, ну плюс-минус.
Чистый специалист говорит:
Я знаю всё про Spring Boot, но не спрашивай меня про API Gateway или React.
А человек с T-образным профилем говорит:
Моя сильная сторона это backend на Java и Spring. Но я достаточно понимаю во frontend, devops, системном дизайне и observability, чтобы нормально сотрудничать, интегрироваться и принимать более взвешенные решения.
В этом разница между девом, который просто пишет код, и девом, который приносит решения.
Самая частая ошибка, я сам так делал:
Путать быть дженералистом с знать много инструментов.
Или путать быть специалистом с вообще не смотреть за пределы своего стека.
Глубину даёт не фреймворк, на котором ты пишешь,
а твоя способность разруливать сложные задачи внутри своей области.
И широту даёт не установка новых тулз,
а способность понимать систему целиком.
Мой взгляд на то, как этим путём идти.
Как всегда, всё зависит от твоего контекста и целей.
Но в реальности я чаще вижу вот что:
Почти все стартуют как дженералисты.
Потом находят для себя какую-то специализацию.
К моменту, когда становимся сеньорами, как правило уже есть T-образный профиль.
Если идёшь в архитектуру или в tech lead, там уже ждут расширенную T: большая широта и со временем несколько глубин.
Важно вот что.
Не зацикливайся на том, чтобы быть экспертом во всём, это невозможно удержать в долгую,
и не закапывайся в роль гуру по одной теме, потому что так можно слишком себя ограничить.
Старайся потихоньку собирать T-образный профиль:
здоровый микс между широкой картиной и реальной глубиной.
Тогда становится проще коллаборировать, проектировать и принимать решения, которые масштабируются.
👉 @BackendPortal
GitHub теперь в Telegram!
Самый прогерский канал, где за 10 минут ты научишься:
/ Пробив по фото и номеру в ТГ
// Как взломать вебку подруги
/// Мануал по OSINT разведке
Подписывайся, нас уже сотни тысяч: >@GitHub
Этот трюк с GitHub PR надо знать
Просто добавь “0” перед словом “github” в URL любого Pull Request, и у тебя откроется полноценный PR-вьювер, который подсвечивает каждую строку diff’а цветом в зависимости от того, сколько внимания от человека она, скорее всего, требует.
Он ищет не только баги. Он подсвечивает всё, что заслуживает второго взгляда: захардкоженные секреты, странные крипторежимы, подозрительную логику или грязный код.
Очень полезный способ быстрее проводить code review и находить то, что обычно легко пропустить.
👉 @BackendPortal
Раньше у GitHub была монолитная база данных, которая держала 950 000 транзакций в секунду 🤯
Но по мере роста компании эта база превратилась в... сами понимаете что. Логичное решение = развалить монолит на несколько меньших баз. На деле все оказалось гораздо сложнее, чем они думали.
Я как раз нашёл видео, где разбирают весь их процесс: какие шаги они предпринимали, как сделали миграцию без даунтайма и при этом ничего не сломали в существующем функционале.
После просмотра ты поймешь, как в реальных проектах мигрируют базы без простоя, как подходить к таким сложным задачам по шагам, и получишь живой пример того, с какими проблемами сталкиваются при масштабировании баз данных и как их решают.
👉 @BackendPortal