Последние посты

Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
9 апр., 07:05
📌 TakeawayRate limiting отлично интегрируется в API Gateway (например, на уровне ingress), Reverse Proxy, Redis для горизонтального масштабирования либо внутри приложения, если логика связана с данными, которые удерживает сам сервис.Стоит помнить, что распределенных системах предпочтение необходимо отдавать глобальными лимитам, а не локальным. Не стоит забывать и о компромиссах (trade-off) между: уровень защиты и удобство пользователей, устойчивость и производительность системы, проста и распределенность.Макс Добрынин Software Engineer⬇️ Поделишься своим списком задач по проектированию и разработке? Пиши о своем опыте в комментариях. 👍 Понравился этот пост? Подписывайся, ставь лайк и поделись постом с другом или коллегой.Курс по Kubernetes | Курс по разработке и проектированию
Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
9 апр., 07:05
📚Шаблон проектирования Rate limiting для защита API от перегрузкиПривет, всем! Макс вещает 😼Мне часто приходится говорить о шаблонах проектирования применяемых в микросервисной архитектуре. И я обратил внимание, что все знают Saga, Outbox, Idempotency, но все игнорируют Rate limiting, хотя он применяется очень часто.Сегодня говорим о том, что такое Rate limiting и когда его надо применять.Rate limiting – это базовый, но критически важный механизм защиты API. Его задача заключается в ограничении количество запросов от клиента за определенный период времени. Без него даже хорошо спроектированная система может прийти в негодонсти под влиянием высокой нагрузки – как от реальных пользователей, так и от ботов, которые регулярно спамят публично доступные URL.🔹Зачем нужен Rate limiting?Во-первых, это защита от
Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
8 апр., 06:01
💡 Главный навык, который отличает дорогих разработчиковМожно посмотреть очень просто. На то, как человек работает с проблемой⬇️Один разработчик: 🔹 получил задачу 🔹 написал код 🔹 закрыл тикетВроде всё ок.Другой: 🔹 задал вопросы 🔹 понял, где эта задача в системе 🔹 предложил решение 🔹 подумал о последствиях 🔹 только потом начал писатьИ вот это уже другой уровень.
Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
7 апр., 08:04изменён
📚Юнит тесты vs. Интеграционные тесты — где на самом деле проходит граница?На самом деле это один из самых «скользких» вопросов. Почти все могут дать определение юнит тестами или интеграционным тестами. Проблемы начинаются, когда просят объяснить разницу между ними на практике И это именно то место, где начинается путаница.Суть в том, что граница между юнит и интеграционными тестами не является столько технической, сколько контекстуальной в рамках покрываемого кода.➖ Для того, чтобы разобраться начнем с простого – классическое определение.Юнит тесты призваны тестировать одну изолированную единицу кода (метод, класс). В данном случае, все зависимости заменены на моки и/или стабы.Интеграционные тесты напротив, проверяют взаимодействие компонентов между собой. Например, как Payment Service взаимодействует с Payment


Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
6 апр., 11:22
🔥 Как готовится к прохождению собеседования по системному дизайну?Вы знаете технологии. Понимаете архитектуру. Работаете с продакшеном. Но на System Design — отказ. И причина почти никогда не в знаниях.System Design — это не про Kafka, Redis и микросервисы. Это про: — умение задавать вопросы — понимание бизнеса — работу с требованиями — аргументацию решений — компромиссыВ новом видео разобрал: • главные ошибки разработчиков • как правильно проходить System Design интервью • как мыслить, чтобы получить оффер


Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
6 апр., 07:10изменён
❓Почему Two-phase commit (2PC) редко используют в реальных системах?На интервью по системному дизайну Two-phase commit (далее 2PC) часто звучит как очевидное решение для случаев, когда существует несколько сервисов или баз данных и необходимо сделать распределенную транзакцию с обеспечением согласованности данных.Но на практике 2PC почти не используют. Давайте разберемся почему⬇️➖ Как работает 2PC?Всегда есть координатор и участники распределенной транзакции. Сам процесс разделен на несколько этапов: 🔹Стадия подготовки – координатор спрашивает: «все готовы закоммитить?» 🔹Стадия согласования – участники блокируют ресурсы и отвечают «да» или «нет» 🔹Стадия выполнения – если все


Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
4 апр., 11:48изменён
🍃Пропагация транзакции между вызовами в Spring FrameworkНа собеседованиях по Java и Spring очень любят спрашивать про @Transactional. Почти все знают про уровни изоляции, но когда разговор заходит о передачи контекста транзакции между вызовами методов (речи идет о параметре Propagation), то ответы резко становятся поверхностными.Хотя именно propagation определяет, что произойдет с транзакцией при вложенных вызовах.Для того, чтобы понять проблему, представим простой сценарий: Один сервисный метод вызывает другой, и оба помечены @Transactional. Вопрос — это одна транзакция или две?. Ответ: зависит от параметра propagation, примененного к аннотации @Transactional.➖ Так что же необходимо знать о параметре propagation?🔹REQUIRED (по умолчанию) Самый распространённый режим. Если
Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
3 апр., 13:19
🔥 Последние 2 места на Курс по проектированию и разработке микросервисной архитектуры 2.0Старт — 6 апреля. Подробнее про курс в посте или на сайте⬇️Новый курс про то, как:— проектировать систему вокруг бизнес-домена (DDD) — строить Event-Driven архитектуру — управлять распределёнными транзакциями (Saga / Outbox) — обеспечивать гарантии доставки сообщений — проектировать отказоустойчивость (Circuit Breaker, Retry, Bulkhead) — строить масштабируемую архитектуру, готовую к росту нагрузки🎯 Кому особенно актуальноЕсли вы: 🔹 действующий разработчик 🔹 работаете с монолитом или простыми сервисами 🔹 чувствуете пробелы в архитектуре
Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
3 апр., 11:20
🔥 ТОП 5 вещей, которые реально усилят твоё резюмеНе “ещё один фреймворк” и даже не “курс по аннотациям”. А то, что реально влияет на офферы.Давайте смотреть👇1️⃣ Опыт разработки системы, а не разные фичиНа самом деле разница огромная.❌ “делал сервис” ✔️ “участвовал в проектировании системы из N микросервисов”Если ты не можешь описать систему — для рынка ты просто исполнитель.2️⃣ Архитектурные решенияНе: “использовал Kafka”, а: 🔹 зачем выбрали Kafka
Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
2 апр., 08:10
❓Почему сообщения дублируются при доставке At-least-onceГарантия at-least-once delivery (доставка «как минимум один раз») часто встречается в в качестве решения. На первый взгляд звучит надежно и создается впечатление, что это сообщение точно не потеряется. Но у этой гарантии есть важное следствие — дубликаты неизбежны.Разберёмся, почему это происходит.В основе лежит простая идея: брокер сообщений считает сообщение доставленным только после получения подтверждения (ack) от потребителя. Пока ack не получен, сообщение считается «необработанным» и может быть отправлено повторно.Типичный сценарий дублирования выглядит так: 🔹Потребитель получает сообщение 🔹Успешно обрабатывает его (например, записывает в базу) 🔹Но не успевает отправить ack (или ack


Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
1 апр., 07:10
📚Почему пагинация решение, которое плохо масштабируется“Offset пагинация” — это самый простой и интуитивный способ разбивать данные на страницы. Он часто используется «по умолчанию», потому что легко реализуется и хорошо ложится в модель page/size. Однако на реальных нагрузках и больших объемах данных этот подход начинает деградировать.Вот пример:SELECT FROM orders ORDER BY created_at DESC LIMIT 10 OFFSET 10000;➖ Проблема производительностиС точки зрения разработчика всё выглядит логично: «пропусти 10 000 записей и верни следующие 10». Но проблема в том, как это операция будет выполнена внутри СУБД. База данных не умеет «перепрыгивать» строки, поскольку не удерживает курсов из предыдущего запроса. Напротив, необходимо пройти через эти 10 000 записей, чтобы определить, какие именно нужно отбросить. Даже при
Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
31 мар., 08:01изменён
⚠️Что делать разработчику в текущих реалиях рынка.Все мы видим, что происходит последнее время на рынке. На 1 вакансию разработчика - тысячи отликов за несколько дней. Наступило время, когда рынок стал рынком работодателя.А это значит, что старые правила больше не работают.Раньше было достаточно: 🔹 знать стек 🔹 писать код 🔹 иметь 2–3 года опытаИ можно было спокойно жить и : 🔹 менять работу 🔹 расти стабильно по зарплате 🔹 получать офферыСейчас этого мало. И многие это уже почувствовали: — отклики есть → офферов нет — интервью проходят → финал не дают
Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
30 мар., 14:07
❓Почему знание AtomicInteger не делает тебя сильнееТы можешь знать: • как работает CAS • что такое атомарность • как устроен multithreadingНо на интервью спросят:“Как ты обеспечишь консистентность данных между сервисами?”И это уже не про Java, а про архитектуру. Именно здесь большинство “сильных разработчиков” начинают плавать.🗓 На курсе по микросервисной архитектуре мы как раз разбираем: 🔹 как работает консистентность в распределённых системах 🔹 какие паттерны реально применяются 🔹 как принимать архитектурные решенияСтарт: 6 апреля
Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
30 мар., 05:45
☕️ AtomicInteger — как работает атомарность без блокировок?На собеседованиях по Java этот вопрос встречается регулярно. И не зря — он отлично проверяет понимание многопоточности. AtomicInteger обеспечивает атомарные операции с помощью CAS (Compare-And-Swap) без использования synchronized и явных блокировок.➖ Как это работает внутри?В основе лежит низкоуровневая инструкция процессора CAS (Compare-And-Swap). Она делает три шага за одну атомарную операцию: 🔹Сравнивает текущее значение с ожидаемым 🔹Если совпадает, заменяет на новое 🔹Если нет, ничего не делаетint prev, next; do { prev = atomicInt.get(); next = prev + 1; } while (!atomicInt.compareAndSet(prev, next)); return next;Если другой поток изменил значение
Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
27 мар., 10:37
🔥 Осталось 5 из 15 мест на Курс по проектированию и разработке микросервисной архитектуры 2.0Старт — 6 апреля. Места разбирают очень быстро.Подробнее про курс в постеНовый курс про то, как:— проектировать систему вокруг бизнес-домена (DDD) — строить Event-Driven архитектуру — управлять распределёнными транзакциями (Saga / Outbox) — обеспечивать гарантии доставки сообщений — проектировать отказоустойчивость (Circuit Breaker, Retry, Bulkhead) — строить масштабируемую архитектуру, готовую к росту нагрузки🎯 Кому особенно актуальноЕсли вы: 🔹 действующий разработчик
Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
27 мар., 06:03
📚Testcontainers или как правильно тестировать интеграцию с базой данныхПривет, всем! Макс вещает 😼Одна из частых проблем на любых проектах это тестирование интеграции с базой данных. Обычно встречаются два подхода: использование мокирования (Mock) или In-memory БД (H2 и др.). Оба варианта имеют серьезные ограничения и недостатки.При мокировании, тест не проверяет реальный SQL-запрос, не выявляет ошибки в запросах, не отражает поведение БД, и др. важные детали.При использовании In-memory БД, элементарно выбранная вами СУБД может отличаться от той, которую вы реально будет использовать в продакшене. Например, для тестов вы используете H2, для среды развертывания PostgreSQL. Это может оказать влияние на работу с индексами, может проявиться различие в SQL-диалектах, и само собой – неожиданные ошибки в проде.Это все можно описать одним выражением:
Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
26 мар., 08:02
☕️ Почему ForkJoinPool быстрее обычных потоков и когда его применятьКогда речь заходит о многопоточности в Java, многие думают о классических потоках (Thread, ExecutorService). Но в задачах с большим количеством мелких операций гораздо эффективнее работает ForkJoinPool.Для того, чтобы разобраться почему это так, сперва необходимо понять в чем проблема обычных потоков.Типичный пример можно представить следующим образом:ExecutorService pool = Executors.newFixedThreadPool(4);Проблемы выражаются в том, что: задачи распределяются статически, один поток может быть перегружен, а другой — простаивать, отсутствует балансировка нагрузки. В результате возможности ЦПУ используется неэффективно.➖ Как работает ForkJoinPool?ForkJoinPool реализует модель Divide → Execute → Merge. Другими словами: задача разбивается на


Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
25 мар., 11:54
🤚 Освойте Kubernetes за 1,5 месяца Объявляем старт набора нового курса по K8SС 2024 года Kubernetes стал де-факто стандартом оркестрации контейнеров. А зарплаты специалистов со знанием Kubernetes в среднем на 18% выше по рынку.Мы сделали курс, который проведёт тебя от Docker до продакшн-кластера: — Мини-группы до 20 человек — Живые занятия 2 раза в неделю с обратной связью от преподавателя — Практика на каждом уроке — Наставник уровня Senior — Полный доступ к записям12 занятий для полного освоения Kubernetes 1. Введение в контейнеризацию 2. Основы Kubernetes 3. Рабочие нагрузки (Pod, ReplicaSet, Deployment) 4. Сетевые ресурсы (Service, ClusterIP/NodePort/LoadBalancer, DNS) 5. Балансировка HTTP-запросов при помощи Ingress Смотреть полную программу


Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
25 мар., 07:06
📚Liquibase — как обновлять схему базы без простоевОбновление схемы базы данных является одной из самых рискованных операций, особенно в продакшене. Неправильная миграция может привести к падению сервиса или всей системы, нежелательным простоям (downtime), несовместимости схемы с ее клиентами и элементарно к финансовым потерям.Liquibase помогает управлять изменениями схемы, но сам по себе не гарантирует отсутствие простоев. Для этого нужно правильно применять “zero downtime” подход.➖ Как работает LiquibaseLiquibase использует changeset (набор изменений). Каждый changeset: выполняется один раз, фиксируется в таблице DATABASECHANGELOG и не повторяется при следующем запуске.Пример:<changeSet id="1" author="dev"> <addColumn tableName="users"> <column name="age" type="int"/> </addColumn> </changeSet>
Максим Добрынин | Как стать востребованным Java разработчиком | ex. Jetbulb
23 мар., 13:53
⚡️ Проектирование и реализация микросервисной архитектуры с применением современных технологий в мини группе до 20 человекСобираем еще одну группу одного из самых востребованных курсов - "Проектирование и разработка микросервисной архитектуры 2.0"Старт уже 6 апреля.Это не курс «про Spring + Kafka». Это курс про архитектурное мышление и системный уровень разработки.❗️ Почему версия 2.0?Потому что рынок изменился. Сегодня чтобы стать востребованным разработчиком нужно:— понимание DDD — работа с событиями — проектирование отказоустойчивости — управление распределёнными транзакциями — гарантии доставки сообщений — безопасность и токены

