backendportal | Unsorted

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

15708

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

Subscribe to a channel

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

Совет по Docker

Как понять, что раздувает образ

Любой Docker-образ состоит из слоев.
Каждая строка в Dockerfile добавляет новый слой.

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

Вот как посмотреть слои и узнать, что именно менялось в каждом из них.

Используй утилиту dive.

Она показывает наглядно:

- какие слои созданы
- какие файлы добавлены или изменены
- сколько места занимает каждый слой

Когда начинаешь изучать слои образа, можно быстро выяснить:

• какая команда в Dockerfile добавляет лишний вес
• как оптимизировать сборку, чтобы образ был меньше и собирался быстрее

Dive также дает оценку «эффективности» образа. Она показывает, насколько много данных дублируется или просто впустую занимает место в слоях.

👉 @BackendPortal

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

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

Платежи не дают второго шанса.

Вот решение, которое стояло перед Марко

Большинство инженеров в первую очередь выбирают скорость.
А потом месяцами пилят возвраты, джобы для сверки и устраняют последствия.

Но платежам плевать на «низкую задержку».
Им важно одно и это не списывать деньги дважды.

Перед ним были такие варианты:

A → Строгая консистентность

Хранить сгенерированный клиентом idempotency key и финальный ответ в надежной БД.
Уникальное ограничение отсекает дубликаты.
Аудируемо. Правильно. Чуть медленнее.

B → Хак с Redis и TTL

SETNX-лок → обработка → кеширование результата.
Очень быстро… пока Redis не перезапустится, TTL не сгорит раньше времени или не случится разделение сети.
И вот ты уже списал деньги дважды и несколько дней «разбираешься».

C → Вера в магию Kafka

Публикуешь событие и надеешься на “exactly-once” в стриме.
Но в платежах корректность нужна до того, как ты возвращаешь успех.
Это решает масштаб, но не ответственность.

D → Починим потом

Позволяешь двойным списаниям происходить.
Потом проводишь аудит, делаешь возвраты, извиняешься и тд
Дешево в реализации. Дорого в доверии.

Марко выбрал A.
Потому что «быстрые» варианты становятся самыми дорогими, когда в игру вступают реальные деньги.

В финтехе побеждает корректность. Всегда.
Задержка раздражает, но двойное списание уничтожает доверие.

👉 @BackendPortal

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

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

Структура данных B-Tree реально крутая штука. Базы данных используют B-деревья для хранения данных на диске, разбивая всё на страницы , обычно по 4–8 КБ. Все операции ввода-вывода происходят именно с этими страницами как единицами.

Как устроена страница

Один из популярных способов организовать данные внутри страницы, называется slotted page structure.
Она начинается с заголовка, за ним идут указатели на ячейки, которые ссылаются на ячейки данных в конце страницы.

Пока ты добавляешь данные:

указатели растут слева направо,

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

Эта середина — формально "свободное место", но прикол в том, что оно может содержать что угодно. Страница и всё дерево вообще не заботятся, что там лежит.

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

Буферный пул и «грязные» страницы

Базы данных ещё поддерживают buffer pool, это кэш страниц, загруженных с диска. Эти страницы часто переиспользуются.
И вот тут появляется интересная оптимизация:
вызов memset (который обнуляет память) занимает время, поэтому базы часто вообще не затирают старые данные.
Удаление записи это просто удаление указателя, но данные на диске остаются.

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

Зарезервированное место в конце страницы

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

SQLite использует этот трюк для фичи reserved space.
Расширения могут сохранять свои данные прямо в каждой странице, не ломая работу дерева.
Например, туда пишут метаданные для шифрования или контрольных сумм.

Кстати, у SQLite есть настройка PRAGMA secure_delete, которая при удалении затирает содержимое нулями, чтобы мусор не утёк никуда , это уже для безопасности.

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

👉 @BackendPortal

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

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

Через 2 дня заканчивается регистрация на Yandex Cup 2025 — 8-й международный чемпионат по программированию с призовым фондом в 12 млн рублей.

В этом году участники смогут попробовать силы в шести направлениях: аналитика, фронтенд, бэкенд, мобильная разработка, а также в двух международных треках — «Алгоритм» и машинное обучение, которые будут доступны на русском и английском языках. Присоединиться могут как юниоры 14-18 лет из России, так и взрослые программисты со всего мира.

Регистрация и пробный тур открыты до 29 октября, квалификация пройдет 2 ноября. Отборочный тур по ML продлится до 5 ноября.

Финал состоится 5-7 декабря в Стамбуле. Он будет посвящен искусству древних мастеров. Разработчикам предстоит продолжить философию крафта в коде.

Подать заявку можно на сайте чемпионата до 29 октября

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

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

👩‍💻 IT теперь в Telegram!

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

Курсы, новости, гайды, советы, мемы, книги — всё, что входит в дневной рацион разработчика.

Забирай доступ: @it_matrix

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

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

Kite — это современная лёгкая панель управления для Kubernetes, которая предоставляет метрики в реальном времени, поддерживает работу с несколькими кластерами, редактирование YAML и управление ресурсами через удобный интерфейс.

https://ku.bz/95jvldnx_

👉 @BackendPortal

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

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

Пользователь сообщил: "Поиск работает медленно." Результаты вернулись за 8 секунд.

Кластер Elasticsearch был в порядке. Запрос оптимизирован. Индексы — здоровые.

Я проследил весь запрос от начала до конца:

Frontend → API: 45 мс

API → Elasticsearch: 180 мс

Запрос в Elasticsearch: 220 мс

API → Frontend: 7 480 мс

API сериализовал 50 000 результатов в JSON до пагинации.

Забирал все результаты

Конвертировал в JSON

Отправлял всё на фронт

Фронт показывал 10 элементов

Фикс: делать пагинацию на уровне Elasticsearch, а не в API.

Новый отклик: 312 мс.

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

👉 @BackendPortal

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

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

#вакансия #удаленка #fulltime #backend
Backend Engineer (Nodejs + Python) — сначала быстро, потом

Мы делаем продукт для BTC-майнинга. Пишем веб-бэкенды на Node.js + Python, гоняем клиентский трафик и телеметрию, храним метрики в Clickhouse, биллинг в Postgres. Нам нужен человек, который быстро доставляет ценность, не боится грязных MVP и умеет превращать их в чистые, наблюдаемые сервисы.

Формат:
- Full-time, remote-friendly (UTC±2 ок).
- Язык: RU на уровне команды.
- Техническая команда: веб-фулстэк, Rust-бэкенд, CTO.
- Решения принимаем быстро, мерджим часто, катим сразу, рефакторим планово.
- Вилка: $3000-$6000

Чем заниматься:
- Проектировать и делать веб-API (REST/WebSocket) для кабинета и админки: биллинг, выплаты, нотификации, вспомогательные сервисы.
- Интеграции: Clerk (auth, impersonation), Postgres (RLS, миграции), ClickHouse (агрегаты статистики), Redis (кэш/lock), R2/S3 (CDN).
- Наблюдаемость: метрики/логи/трейсинг, дашборды и алерты (Prometheus/Grafana/Loki).
- Производительность: индексы, EXPLAIN, профилирование, backpressure.

Технологии (основное):
- Node.js (TypeScript, Express/Nest/Fastify), Python (FastAPI/aiohttp), async I/O.
- Postgres (SQL, триггеры и хранимки, индексы, планировщик), ClickHouse, Redis
- Docker, GitHub Actions.
- Линтеры/тайпчекеры: ESLint/Prettier, ruff/black/mypy, pyright.

Как мы работаем («быстро на костылях → потом нормально»):
- Спринт 1–3 дня: узкий MVP, минимум слоёв, прямые SQL/SDK, фича-флаг, happy-path e2e.
- Дожим после релиза: типизация, валидация (Pydantic/Zod), идемпотентность, ретраи с backoff, метрики, алерты, интеграционные тесты, миграции и docs (короткие ADR).
- В PR ждём: чёткие таймауты, поведение при ошибках, метрики и лог-ключи для дебага.

Требования (must-have):
- 4+ лет в бэкенде, реально продуктивен в Node.js и/или Python, готов работать в обоих.
- Сильный SQL/Postgres: индексы, EXPLAIN, блокировки, миграции; понимаешь, где узкие места.
- Асинхронщина, очереди, кэш, идемпотентные API, ретраи/таймауты/backoff, at-least-once/дедуп.
- Наблюдаемость как привычка: метрики до кода, лог-корреляция, дешёвые SLO.
- Умение быстро «прибить костыль» и потом довести до прод-качества.

Будет плюсом:
- ClickHouse, высоконагруженная телеметрия.
- Понимание домена: финтех, крипто.
- Pulumi, Prometheus/Grafana/Loki.
- Supabase (RLS), Clerk, R2/S3.

Что считаем успехом (30/60/90):
- 30 дней: 3–4 фичи в проде, метрики/алерты на свои сервисы, первое снятие узкого места (индекс/кэш).
- 60 дней: закрыт e2e «регистрация → начисления → баланс», выплаты в sandbox, стабилизирован оффлайн-детект.
- 90 дней: берёшь end-to-end зону (Billing или Notifications), выжигаешь технический долг v0, покрытие интеграционными тестами ≥60% на своём коде, минус 3 главных перф-бутылочных горлышка.

Кому точно к намЖ
- Ты делаешь PR в тот же день, не ждёшь идеального ТЗ.
- Тебя не пугает переписывать свой код через неделю, если так быстрее для бизнеса.
- Любишь цифры: latency, error-rate, p95, RPS — не «где-то там», а в твоём дашборде.

Кому лучше не к нам:
- Нужен «архсовет на 6 встреч» перед Hello World.
- Болит от временных решений и фича-флагов.
- Не готов брать на себя поддержку того, что выкатил.


Процесс найма:
- Выполнение тестового задания.
-60 мин созвон: разбираем тестовое задание, короткий deep-dive по одному твоему проекту (где ты сначала сделал «как попало», а потом правильно).

Финальное собеседование с CEO.

-Как откликнуться: пришлите 1–2 ссылки на репо/PR + 3–5 предложений про ваш «костыль → нормальное решение» (какие компромиссы, какие метрики улучшили).

— Готовы «возить углём» и шипить быстро? Поговорим.

Telegram: @dishsh

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

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

Docker это не мини-виртуальные машины

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

1. Docker — это не виртуалка

Когда ты запускаешь docker run ubuntu, ты не создаешь «мини-компьютер».

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

Поэтому он стартует за миллисекунды и ест меньше оперативки, чем виртуальная машина.

2. Изоляция достигается через namespaces

Namespace говорит системе:
«Этот процесс видит только вот этот кусочек мира».

Примеры:

PID namespace — контейнер думает, что его процесс 1 — единственный.

NET namespace — у контейнера своя сеть и интерфейсы.

MNT namespace — своя файловая система с примонтированными ресурсами.

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

3. Cgroups ограничивают ресурсы

Контейнер может считать, что владеет всей машиной…
но control groups (cgroups) ставят реальные лимиты:

- максимум CPU (--cpus=2)
- максимум памяти (--memory=1g)
- лимиты на I/O или количество процессов

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

4. Файловая система и слои (UnionFS)

Образ это не один файл, а набор слоев.
Каждая инструкция RUN, COPY или ADD в Dockerfile создает новый слой.

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

Вот почему все изменения исчезают после удаления контейнера —
временный слой просто выкидывается.

5. Как контейнеры общаются между собой

Docker создает виртуальные сети внутри хоста.
Каждый контейнер получает свой внутренний IP.

Когда ты используешь --link или docker-compose,
ты просто задаешь внутренние DNS-имена.

Во внешний мир трафик не выходит,
пока ты сам не пробросишь порт через -p 8080:80.

6. Безопасность -изоляция не идеальна

Поскольку ядро общее, защита не такая жесткая, как у виртуалки.

Для этого и придуманы штуки вроде:

gVisor — песочница для системных вызовов
SELinux или AppArmor
rootless Docker

Если запускаешь сторонние контейнеры — лучше использовать их.

Так что же такое Docker на самом деле?

Это оркестратор изоляции:

- прячет ресурсы через namespaces
- ограничивает их через cgroups
- управляет файловой системой через UnionFS
- эмулирует сеть через network namespaces

Он ничего не эмулирует по-настоящему,
он просто создает очень правдоподобную иллюзию 👏

Понимание этого полностью меняет подход к дебагу и оптимизации.

Контейнер жрет всю оперативку? → смотри cgroups.
Не может подключиться к сети? → проверь network namespace.
Билды весят по 5 ГБ? → разбери слои образа.

👉 @BackendPortal

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

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

Паттерны микросервисов для Backend-разработчиков

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

🔸Application Architecture Patterns
Высокоуровневые схемы структуры систем:
- Monolithic architecture
- Microservice architecture

🔸 External API Patterns
Подходы к проектированию API для сторонних разработчиков:
- API Gateway
- Backends for Frontend (BFF)

🔸Decomposition Patterns
Как разделить большую систему на независимые сервисы:
- Decompose by business capability
- Decompose by subdomain

🔸Testing Patterns
Подходы к проверке корректности микросервисов:
- Consumer-driven contract test
- Consumer-side contract test
- Service component test

🔸Messaging Style Patterns
Схемы асинхронного взаимодействия сервисов:
- Messaging
- Remote Procedure Invocation (RPI)

🔸Security Patterns
Решения для аутентификации и авторизации:
- Access Token

🔸Reliable Communication Patterns
Техники обработки сбоев при взаимодействии сервисов:
- Circuit Breaker

🔸Cross-cutting Concerns Patterns
Обработка общих функций вроде логирования и метрик:
- Externalized Configuration
- Microservice Chassis

🔸 Service Discovery Patterns
Как сервисы находят друг друга в сети:
- 3rd Party Registration
- Client-side Discovery
- Self-registration
- Server-side Discovery

🔸Observability Patterns
Как понять, что происходит внутри системы:
- Application Metrics
- Audit Logging
- Distributed Tracing
- Exception Tracking
- Health Check API
- Log Aggregation

🔸Transactional Messaging Patterns
Обеспечение согласованности данных между сервисами:
- Polling Publisher
- Transaction Log Tailing
- Transactional Outbox

🔸Deployment Patterns
Подходы к безопасному релизу новых версий сервисов:
- Deploy as Container
- Deploy as VM
- Language-specific Packaging
- Service Mesh
- Serverless Deployment
- Sidecar

🔸Data Consistency Patterns
Как управлять целостностью данных в распределённых БД:
- Saga

🔸Business Logic Design Patterns
Как организовать доменную модель и бизнес-логику:
- Aggregate
- Domain Event
- Domain Model
- Event Sourcing
- Transaction Script

🔸Refactoring to Microservices Patterns
Как поэтапно мигрировать монолит в микросервисы:
- Transaction Script
- Strangler Application

🔸Querying Patterns
Как извлекать данные из нескольких сервисов:
- API Composition
- CQRS (Command Query Responsibility Segregation)


Освой эти паттерны и ты поймёшь, как проектировать надёжные, масштабируемые и поддерживаемые системы.

👉 @BackendPortal

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

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

30 октября приглашаем на MWS Cloud Day: первую технологическую конференцию MWS про облака.

Вас ждёт:

• Премьера MWS Cloud Platform — нового облака собственной разработки от MWS
• Доклады о технологиях и архитектурных решениях под капотом нового облака
• Выставочная зона с демостендами и кастомным мерчом
• Панельная дискуссия с ведущими экспертами отрасли
• Афтепати и неформальное общение вечером

📍Где и когда:
30 октября
Москва, кинотеатр «Художественный» + онлайн

Участие бесплатное, но нужно зарегистрироваться

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

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

Лёгкий сервер, мониторинг Docker и система алертов

https://github.com/henrygd/beszel/

👉 @BackendPortal

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

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

На одном собеседовании по системному дизайну я использовал Kafka.
На другом — Redis.
На третьем — S3.

Но на всех собеседованиях я использовал базы данных.

Базы данных — это основа любого дизайна, независимо от масштаба, стека или домена.

Если ты понимаешь, как данные хранятся, запрашиваются, индексируются, реплицируются и шардируются — ты уже понимаешь процентов 70 системного дизайна.

Не отвлекайся на блестящие новые компоненты. Очереди, кэши и оркестраторы приходят и уходят.
А базы данных остаются.

Реляционные, NoSQL, time-series, векторные — паттерны меняются, но принципы одни и те же:

- Пути чтения и записи
- Индексация и кэширование
- Транзакции и уровни изоляции
- Репликация и партиционирование

Пойми, как движутся данные и ты увидишь, как всё остальное в системе связывается между собой.

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

👉 @BackendPortal

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

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

Бэкэнд Go с открытым исходным кодом, подписками в реальном времени, встроенной базой данных, пользовательским интерфейсом администратора

https://github.com/pocketbase/pocketbase/

👉 @BackendPortal

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

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

Как пишет автор: «...эта статья лишь поверхностно касается темы кеширования...». И правда, кеширование — тема интересная и глубокая.

Советую почитать эту интерактивную статью, а потом кейсы в конце. Они хорошо показывают, как кеширование применяется на практике.

planetscale.com/blog/caching

👉 @BackendPortal

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

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

Векторные базы данных простыми словами

Представь, у тебя есть 10 000 описаний товаров. Пользователь ищет "удобная уличная мебель".

Обычная база данных:

Ищет точные совпадения слов

Находит товары с "удобная" ИЛИ "уличная" ИЛИ "мебель"

Пропускает "уютные кресла для террасы", хотя это то же самое

Ключевые слова — тупой способ поиска

Векторная база данных:

Превращает запрос в набор чисел, отражающих смысл: [0.2, 0.8, 0.1, 0.9, ...]

Каждое описание товара тоже превращается в такие числа

Сравнивает эти "векторы" и ищет похожие по смыслу

Находит "уютные кресла для террасы", потому что векторы похожи

Смысловой поиск — умный поиск

Как это работает

Шаг 1. Превращаем текст в векторы (массивы чисел)

"comfortable chair" → [0.2, 0.7, 0.1, 0.4, ...]

"cozy seat" → [0.3, 0.8, 0.2, 0.5, ...]

Похожие фразы → похожие числа

Это делает AI-модель, например OpenAI embeddings

Шаг 2. Храним векторы

В обычной БД хранят текст

В векторной — массив чисел для каждого объекта

Индексируют их, чтобы быстро искать по схожести

Оптимизировано под "найди похожие", а не "найди точное"

Шаг 3. Ищем по схожести

Запрос: "outdoor furniture"

Превращается в [0.3, 0.6, 0.2, 0.8, ...]

Система ищет ближайшие векторы (через cosine similarity)

Результаты сортируются по степени похожести

Где это используется:

- Поиск товаров, который понимает смысл, а не только слова
- Поиск по документации, который находит релевантные ответы
- Рекомендательные системы
- Чатботы, ищущие похожие вопросы
- Обнаружение аномалий

Популярные векторные базы

Pinecone = управляемая, простая, но дорогая
Weaviate = опенсорс, с кучей функций
Milvus = быстрая и масштабируемая, но сложная
pgvector = расширение для Postgres, простое и удобное
Qdrant = быстрая, написана на Rust

Спорная, но практичная мысль

В большинстве проектов тебе не нужна отдельная векторная база.
Начни с Postgres + pgvector = этого хватает, пока у тебя меньше 1 миллиона векторов.
Когда масштаб вырастет, тогда уже смотри в сторону специализированных решений.

👉 @BackendPortal

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

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

👩‍💻 В сеть вывалилась гигантская куча курсов и книг

Держи сотни гигабайт свежих уроков, и каждую неделю мы подкидываем ещё!

• 1612 ГБ — DevOps
• 1402 ГБ — Python
• 1300 ГБ — C, C++
• 1815 ГБ — Frontend
• 1515 ГБ — Backend
• 898 ГБ — ИБ, Хакинг
• 996 ГБ — Kotlin, Swift
• 212 ГБ — JavaScript
• 315 ГБ — Flutter
• 820 ГБ — Go, PHP
• 419 ГБ — Java, Rust
• 648 ГБ — GameDev
• 517 ГБ — Windows, Linux
• 998 ГБ — Дизайн (UX/UI)
• 617 ГБ — Нейросети (ML/RL)
• 546 ГБ — БД (SQL & NoSQL)
• 687 ГБ — Аналитика данных
• 115 ГБ — QA-тестирование


Подписывайся и не плати за то, что можно получить бесплатно

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

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

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

70+ алгоритмов на JavaScript, Java и C++, всё интерактивно и с наглядной визуализацией

Забираем здесь 🍯

@linuxos_tg

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

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

У тебя микросервисная архитектура. OrderService должен дать сигнал EmailService, чтобы тот отправил письмо. Ты поднимаешь простую очередь - Redis или RabbitMQ. OrderService пушит задачу, EmailService её читает. Всё вроде бы работает.

Потом появляется AnalyticsService, которому тоже нужно знать об этом заказе. Но уже поздно, ведь EmailService прочитал и удалил сообщение. Тогда ты добавляешь костыль: OrderService пишет сразу в две очереди. Потом приходит FraudService и теперь уже три. В итоге OrderService превращается в хрупкий, связанный узел, от которого всё зависит.

Ты слышал про Kafka и думаешь: «Да это просто очередь, только сложнее». Но нет. Kafka это не очередь, а лог. И вот это всё меняет.

В обычной очереди, как в RabbitMQ, сообщение живёт как таска в туду-листе. Консьюмер его забирает, и оно исчезает. Если сервис упал то сообщение потеряно, если не строить сложный retry. И только одна группа консьюмеров может получить сообщение.

В Kafka всё иначе. Сообщения это события, которые не удаляются после чтения. Они публикуются в топик, например all-orders, и записываются в файл, как в git-лог, в порядке поступления. Эти данные устойчивы и защищены от сбоев по умолчанию.

Самое интересное начинается, когда понимаешь, что консьюмеры ничего не "вытаскивают". Они просто читают лог, начиная с определённого offset. EmailService читает лог, AnalyticsService читает тот же лог, только в своём темпе, FraudService тоже. Каждый в своей consumer group, и Kafka это не волнует. OrderService просто один раз "кричит в пустоту" и не заботится, кто услышит. Всё максимально развязано.

А теперь представь, что EmailService упал. Всё равно не страшно, ведь сообщение осталось в логе. После перезапуска он продолжит читать с того места, где остановился. Потерь нет. Потом ты выкатываешь новый RecommendationService с ИИ и говоришь ему: «Начни с начала топика all-orders, прочитай последние полгода истории и построй модель». Он спокойно переигрывает прошлое. С очередью так сделать нельзя.

Kafka это не message bus. Это распределённый, отказоустойчивый и постоянный источник истины для всей компании. По сути, центральная нервная система современного бизнеса, который живёт на данных.

👉 @BackendPortal

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

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

Производство упало. Health-чеки балансировщика валятся. Все инстансы помечены как unhealthy.

Зашёл по SSH на инстанс:

Приложение: запущено

CPU: 5%
Память: 40%
Диск: 15%
Сеть: ок

Ручной запрос к health-эндпоинту:

curl localhost/health
{"status": "ok"}


Отработал идеально.

Проверил логи балансировщика:

Health-check URL: /health


Ответ: timeout

Инстанс помечен как unhealthy

Проблема:

Локально health-эндпоинт отвечал за 100 мс

Таймаут балансировщика: 2 секунды

Должно с запасом хватать

Потом заметил: health-чек запускался каждые 5 секунд.

Приложение логировало каждый health-чек. В файл. Файл разросся до 47 ГБ.

Каждый health-чек:

- Открывал 47-гиговый лог
- Добавлял одну строку
- Закрывал файл
- Занимал 3 секунды из-за размера файла
- Укладывался в таймаут? Нет, получался timeout

Фикс: отключил логирование health-чеков. Время ответа вернулось к 100 мс.

👉 @BackendPortal

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

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

⚡️ На Stepik вышел курс по Linux

Ребята сделали крутейший курс по Linux, где понятным языком, шаг за шагом, на реальных примерах и с наглядными схемами обучают работе с этой ОС

Внутри 20+ модулей: от установки Linux и работы с файлами до сетей, прав, дисков, процессов, автоматизации на Bash и многого другого. Всё сразу закрепляется на практике (200+ заданий с автопроверкой).

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

Есть бесплатные демо-уроки для ознакомления. В ближайшие 48ч курс доступен со скидкой 25% по промокоду «25LINUX»: открыть курс на Stepik

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

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

Вчера пробовал cloudflared от Cloudflare, чтобы пробросить локально запущенное API для теста интеграции с GitHub — честно, 10/10.

Даже аккаунт Cloudflare не нужен.

Установил пакет и запустил:

cloudflared tunnel --url http://localhost:8000


И всё.

Раньше всегда пользовался ngrok, но решил попробовать это — понравилось, что для теста не нужен аккаунт.

👉 @BackendPortal

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

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

Когда backend dev сделал frontend

- он отзывчивый из коробки
- загружается за 0,00004 секунды

👉 @BackendPortal

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

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

Оптимизировали Docker-образ: минус 540 МБ!

Ужали размер образа с 588 МБ до 47.7 МБ — почти в 12 раз меньше.

Что сделали:

- Перешли на Python 3.9-alpine — лёгкий и быстрый базовый образ.
- Объединили RUN-инструкции, чтобы не плодить лишние слои.
- Добавили .dockerignore, чтобы не тянуть в сборку кеши и временные файлы.
- Перешли на multi-stage build: на выходе только то, что реально нужно в проде.

Результат:

Образ стал на 91.89% меньше
Контейнеры стартуют быстрее
Деплой стал легче, а сборка — быстрее

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

👉 @BackendPortal

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

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

Здесь разбирают, как работают key-value базы данных и как можно сделать свою с нуля. (на Go)

👉 @BackendPortal

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

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

Парень реализовал свой аналог Redis на Go 👍

Фичи:

- Асинхронный (на epoll) и синхронный (на goroutine) серверы
- Полная поддержка протокола RESP
- Базовые команды: PING, SET, GET, DEL, TTL
- Готов к запуску в Docker для удобного деплоя

👉 @BackendPortal

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

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

В проекте используется Redis, и нужно часто его просматривать и управлять. Многие инструменты либо устарели, либо перегружены.

Недавно нашёл Tiny RDM — лёгкое и удобное десктоп-приложение для работы с Redis. Построено на WebView2, не тянет встроенный браузер, интерфейс чистый и понятный. Все операции с ключами: добавление, удаление, просмотр, редактирование

Поддерживает SSH, SSL, HTTP, SOCKS5, встроен редактор Monaco, как в VS Code. Есть разные форматы просмотра данных, мониторинг команд в реальном времени и slow logs для анализа производительности.

Работает на Windows, macOS и Linux, есть светлая и тёмная тема.

👉 @BackendPortal

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

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

У больших компаний десятки сервисов, сотни сотрудников и свои правила безопасности. Каждый новый аккаунт в облаке — это лишний пароль, риск и головная боль для IT-отдела. Чтобы от этого избавиться, мы реализовали федеративный вход в MWS Cloud Platform.

В новой статье рассказываем:

⏺️как работает федерация в MWS и причём здесь SSO;
⏺️почему мы выбрали модель syncless, а не синхронизацию пользователей;
⏺️как маппинг атрибутов позволяет гибко настраивать права доступа пользователей в MWS Cloud Platform;
⏺️зачем это бизнесу.

Федерация превращает облако в естественное продолжение вашей IT-инфраструктуры без лишних логинов и с полным доверием к вашему IdP.

⏩Читать статью

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

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

Используем insteadOf в Git для Замены HTTPS-адресов на SSH

При работе с Git-репозиториями вы часто сталкиваетесь с URL-адресами в формате HTTPS, особенно при клонировании из GitHub, GitLab или других хостинг-провайдеров. Однако, если вы предпочитаете использовать SSH для аутентификации (что часто удобнее с аутентификацией по ключам), ручное изменение URL-адресов может быть утомительным. Кроме того, это может быть ещё сложнее при работе с субмодулями.

Конфигурационная опция Git insteadOf предлагает элегантное решение, автоматически переписывая URL-адреса «на лету»:

git config --global url."git@github.com:".insteadOf "https://github.com/"
git config --global url."git@gitlab.com:".insteadOf "https://gitlab.com/"
git config --global url."git@bitbucket.org:".insteadOf "https://bitbucket.org/"


Вы также можете настроить более конкретную проверку и выбрать только определённые репозитории или сервисы. Например, если вы хотите заменить HTTPS-адреса некоторых репозиториев, вы можете сделать следующее:

git config --global url."git@github.com:username/".insteadOf "https://github.com/username/"


После настройки Git будет автоматически переписывать URL:

# Следующая команда
git clone https://github.com/user/repo.git

# Станет эквивалентной
git clone git@github.com:user/repo.git


Перезапись происходит прозрачно. Вы по-прежнему можете использовать HTTPS-адреса в командах, документации или при копировании из веб-интерфейсов.

Ещё один вариант использования insteadOf — добавление аутентификации к URL. Например, если вы хотите использовать определённого пользователя для всех запросов Git, вы можете сделать следующее:

git config --global url."https://<token>@github.com/".insteadOf "https://github.com/"


👉 @BackendPortal

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

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

Нашёл классную альтернативу Postman и Insomnia — Yaak.

Это лёгкий и быстрый инструмент для тестирования API, написанный на Tauri, Rust и React. Работает офлайн, не сливает данные и поддерживает REST, GraphQL, gRPC, WebSocket и другие протоколы.

Можно импортировать коллекции из Postman, использовать переменные окружения, хранить ключи в системном хранилище и даже кастомизировать интерфейс.

Репозиторий: github.com/mountain-loop/yaak

👉 @BackendPortal

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