1. RabbitMQ: час і контекст
Якби ми додали RabbitMQ на самому початку курсу, це виглядало б ефектно, але методично було б схоже на спробу вчитися керувати автомобілем одразу на гоночному боліді: наче й круто, але ви ще не впевнені, де педаль гальма, і дуже швидко опинитеся в кущах. RabbitMQ — це не «складніше за Docker»; він просто додає ще один тип залежності, який потрібно вміти підіймати, налаштовувати й діагностувати в Compose-оточенні.
Саме тепер у нас уже є стійка база: стек app + postgres + redis працює, профілі не перетворилися на конфігураційний лабіринт, а логи ми вміємо читати не як художню літературу, а як технічні докази. RabbitMQ логічно додавати після цього фундаменту, бо інакше будь-яка помилка виглядатиме однаково: «усе зламалося», і ви не зможете відрізнити, що саме зламалося — база, кеш, застосунок чи ваша віра в localhost.
Є ще одна важлива причина, чому саме тепер. До RabbitMQ у нас були залежності, які зазвичай сприймаються як «сховище» (PostgreSQL) та «прискорювач читання» (Redis). RabbitMQ додає третій клас: посередник для повідомлень. Це корисно навіть на мінімальному рівні, бо типовий бекенд-проєкт у реальному житті часто має хоча б один такий компонент: або RabbitMQ, або Kafka, або якийсь керований брокер у хмарі. Ми не перетворюємо курс на messaging-track, але показуємо: ось так виглядає зріле локальне оточення, де крім БД і кешу є ще й брокер.
Нарешті, це хороший момент для дисципліни мислення: додавання нової залежності не повинно вести до переписування всього застосунку. Ми не створюємо другий сервіс, не переходимо до мікросервісів, не запроваджуємо окремий «docker-режим» коду. Ми робимо рівно те, що вже робили раніше: додаємо сервіс у Compose, вмикаємо профіль і перевіряємо мінімальний сценарій.
2. RabbitMQ як інфраструктура
Є небезпечний момент, який хочеться вловити одразу, поки він не втік: RabbitMQ справді може бути частиною великої архітектури (з топологіями, обмінниками, ключами маршрутизації, ретраями, DLQ, дедуплікацією та філософськими суперечками «у нас event-driven чи просто черга»). Але сьогодні ми туди не йдемо, бо наш курс про Docker/Compose як щоденний інструмент Java-розробника, а не про те, як стати брокерним шаманом.
У нашому контексті RabbitMQ — це такий «поштовий відділ» усередині локального стенду. Застосунок кладе туди «лист» (повідомлення), а потім хтось його забирає. Це зручно як навчальна модель, бо дозволяє зробити мінімум, який перевіряє звʼязування оточення: брокер піднявся, застосунок підʼєднався, повідомлення пішло, повідомлення прийшло. Усе. Без фанатизму й без «а давайте спроєктуємо систему як у FAANG» (що зазвичай означає «давайте ускладнимо собі життя, щоб потім героїчно його спростити»).
Важливо також утримати межу проєкту. Наш Container-Ready Catalog Service залишається одним Spring Boot-застосунком. RabbitMQ не змушує нас робити другий сервіс-споживач. Ми можемо отримувати повідомлення всередині того самого застосунку (через @RabbitListener) і просто логувати факт отримання. У реальному продукті, звісно, частіше будуть різні сервіси. Але тут мета інша: показати Compose-стек і конфігураційну дисципліну, а не побудувати розподілену систему.
Якщо сказати зовсім чесно: сьогодні RabbitMQ потрібен нам як «ще один контейнер, до якого застосунок має вміти підключатися за імʼям сервісу». Ми тренуємо не брокер, а вміння не губитися, коли в стеку стає на один сервіс більше.
3. Що має вийти до кінця дня
Тут важливо не переплутати мету. Сьогодні достатній результат — не «вивчили RabbitMQ взагалі», а акуратно вбудували ще одну залежність у той самий Compose-стенд і не перетворили проєкт на новий архітектурний трек.
До кінця цього етапу має бути зрозуміло три речі:
— де живе rabbitmq у compose.yaml і як застосунок знаходить його за імʼям сервісу;
— як messaging вмикається як ще один режим виконання того самого Spring Boot-застосунку;
— за якою мінімальною ознакою видно, що звʼязка справді працює: повідомлення пішло й дійшло, а це видно в логах.
Якщо ці три пункти складаються в один причинно-наслідковий ланцюжок, етап уже виконав свою роботу.
4. З чого складається цей крок
Порядок тут важливий. Спершу потрібен сам брокер як звичайний сервіс Compose: зрозуміла назва rabbitmq, нормальні порти й швидкий спосіб перевірити, що контейнер взагалі живий. Потім — runtime-конфіг застосунку: той самий image, але з messaging профілем і параметрами підключення, а не окремий jar і не новий Dockerfile.
І лише після цього має сенс дивитися на один короткий шлях повідомлення: HTTP-дія викликала відправлення, RabbitMQ прийняв повідомлення, listener його отримав, а в логах залишилися обидві точки. Цього достатньо, щоб стенд став реалістичнішим і водночас не розпався на другий сервіс, другий шлях збирання і нову релігію «а давайте одразу спроєктуємо подієво-орієнтований всесвіт».
5. Типові помилки під час роботи з RabbitMQ
Помилка №1: очікування «сьогодні ми вивчимо RabbitMQ цілком».
RabbitMQ — велика тема, і її можна вивчати місяцями, особливо якщо почати читати про топології, гарантії доставки й «як правильно проєктувати подієво-орієнтовану архітектуру». У межах цього курсу RabbitMQ — інфраструктурний компонент стенду. Якщо тримати очікування «мінімальне звʼязування й мінімальний обмін», матеріал стає набагато зрозумілішим і не створює відчуття «мені недодали».
Помилка №2: спроба перетворити проєкт на кілька сервісів.
Часта реакція на слово «broker»: «о, значить треба зробити окремий сервіс-споживач!». У реальному світі це часто так, але в нашому навчальному проєкті це миттєво збільшить поверхню складності: другий сервіс, другий Dockerfile, другий життєвий цикл — і ви почнете вивчати мікросервіси замість Compose. Ми залишаємося в одному застосунку й використовуємо брокер як залежність.
Помилка №3: бажання «одразу зробити красиво» — кілька черг, обмінників і складні повідомлення.
Це виглядає як турбота про майбутнє, але насправді ламає послідовність. Сьогодні нам потрібно побачити один прозорий шлях повідомлення. Щойно з’являються кілька черг, маршрутизація і складний payload, ви починаєте налагоджувати іменування та конфігурацію, а не Compose-зв’язність.
Помилка №4: занурення в архітектурні суперечки раніше, ніж зібрано сам стенд.
На цьому місці легко піти в розмови «а чому не Kafka», «а чи потрібна взагалі асинхронність», «а де тут event-driven architecture». Усе це цікаві питання, але вони не допомагають вам сьогодні вбудувати брокер у Compose-стек. Спершу потрібне робоче звʼязування, а вже потім — будь-які великі суперечки про світ.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ