Модуль 4

Встановлення RabbitMQ та перший запуск

Ось твій урок у стилі CS50. Вмикай уяву, ми починаємо! 🚀


🐰 Урок: Встановлення RabbitMQ та перший запуск

Привіт, друзі! Радий бачити вас на цьому занятті.

1. 🔥 Вступ: Чому ми тут?

Давайте почнемо з реальної ситуації. Уявіть, що ви пишете бекенд для інтернет-магазину у "Чорну п’ятницю".

Тисячі користувачів одночасно натискають кнопку "Купити". Ваша система повинна зробити купу речей: 1. Зняти гроші з картки. 2. Оновити склад (мінус один iPhone). 3. Надіслати чек на email. 4. Створити накладну для служби доставки. 5. Надіслати SMS-повідомлення.

А тепер скажіть мені: чи повинен клієнт чекати 5-10 секунд, дивлячись на кружечок завантаження, поки ваш сервер намагається достукатися до поштового сервісу, щоб відправити PDF-чек?

Звісно, ні! Це жахливий UX (користувацький досвід). Клієнт хоче натиснути "Купити" і миттєво побачити "Дякуємо за замовлення!".

Тож як зробити так, щоб важкі задачі (листи, PDF, логістика) виконувалися, але не гальмували основний процес?

Тут на сцену виходить RabbitMQ.

Уявіть собі велику професійну кухню ресторану. * Офіціант (Ваш сайт) приймає замовлення. Він не біжить на кухню смажити стейк. Він просто чіпляє папірець із замовленням на спеціальну вертушку (або кладе в систему). * Він одразу повертається до клієнта. * Кухар (Worker) бачить папірець, забирає його і починає готувати, коли має вільні руки.

RabbitMQ — це і є та сама "вертушка" або поличка для замовлень. Це брокер повідомлень. Він дозволяє одній частині вашої програми сказати іншій: "Гей, зроби це, коли буде час, а я пішов далі працювати".


2. 🧠 Теоретична база (Що там під капотом?)

Перш ніж ми відкриємо термінал, давайте розберемося з анатомією цього "звіра".

RabbitMQ реалізує протокол AMQP (Advanced Message Queuing Protocol). Звучить страшно? Забудьте поки що про абревіатуру. Ось що вам дійсно треба зрозуміти інтуїтивно:

🎭 Головні дійові особи:

  1. Producer (Продюсер/Видавни́к): Це ваша програма, яка створює задачу. (Наприклад, модуль замовлень каже: "Треба надіслати лист").
  2. Message (Повідомлення): Самі дані. Це може бути просто рядок "Hello" або складний JSON об'єкт {"email": "user@test.com", "item": "iPhone"}.
  3. Queue (Черга): Це буфер. Уявіть собі поштову скриньку, яка може розтягуватися до нескінченності. Повідомлення живуть тут, поки їх не заберуть.
  4. Consumer (Консьюмер/Споживач): Це програма (скрипт), яка сидить і чекає: "Чи є щось у черзі?". Як тільки з'являється — вона це хапає і обробляє.

⚙️ Як це працює (спрощено):

Продюсер ➡️ кидає повідомлення в RabbitMQ ➡️ повідомлення чекає в Черзі ➡️ Консьюмер забирає його.

⚠️ Що треба запам'ятати зараз:

RabbitMQ написаний на мові Erlang. Це дуже потужна мова для телекомунікацій. * Чому це важливо? Тому що встановити RabbitMQ "голим" на Windows чи macOS іноді буває боляче (треба ставити Erlang, налаштовувати версії...). * Яке рішення? Docker. Ми використаємо контейнер, де все вже налаштовано за нас. Це професійний шлях.


3. 🧪 Приклади: Запускаємо магію

Замість того, щоб писати код, ми спочатку запустимо RabbitMQ і подивимося на нього очима.

Крок 1: Встановлення через Docker

Я припускаю, що Docker у вас уже стоїть (якщо ні — це перше, що робить сучасний розробник).

Відкрийте термінал. Що ви очікуєте, якщо ми просто напишемо docker run rabbitmq? Ми отримаємо "голий" сервер без інтерфейсу. Нам це не підходить для навчання. Нам треба бачити, що відбувається.

Тому ми використаємо версію з тегом management. Вводьте команду:

docker run -d --name my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3-management

Розбір польотів: * -d: Запустити у фоні (Detached). * --name my-rabbit: Даємо ім'я контейнеру, щоб потім легко його знайти. * -p 5672:5672: Це порт для програм (туди будуть стукати ваші скрипти на Python/Java/JS). * -p 15672:15672: Це порт для адмін-панелі (веб-інтерфейс). * rabbitmq:3-management: Сама назва образу. Зверніть увагу на слово management! Без нього не буде красивих кнопочок.

Крок 2: Вхід у "Матрицю"

Відкрийте браузер і перейдіть за адресою: 👉 http://localhost:15672

Ви побачите вікно логіна. Стандартні дані (тільки для розробки!): * Username: guest * Password: guest

Вітаю! Ви всередині панелі керування RabbitMQ. Тут виглядає як кабіна пілота, правда? Не лякайтеся графіків.

Крок 3: "Hello World" без коду

Давайте створимо свою першу чергу і надішлемо повідомлення вручну.

  1. Перейдіть у вкладку Queues (Черги).
  2. Знайдіть блок "Add a new queue".
  3. У полі Name напишіть: first_task_queue.
  4. Натисніть кнопку Add queue.

Внизу з'явиться ваша черга. Натисніть на її назву (first_task_queue). Ви потрапили в меню конкретної черги. Знайдіть розділ Publish message.

  • У полі Payload (корисне навантаження) напишіть: Привіт, Кролику!
  • Натисніть Publish message.

Що сталося? Подивіться на графік "Ready". Там з'явилася цифра 1. Повідомлення лежить у черзі і чекає. Воно нікуди не зникло. Воно чекає "Кухаря".

Тепер знайдіть розділ Get messages. * Натисніть кнопку Get Message(s).

Ви побачите ваше повідомлення: Привіт, Кролику!. RabbitMQ віддав його вам.


4. 🛠 Практична частина

Тепер ваша черга! Відкрийте термінал і браузер.

Завдання 1: Запуск Зупиніть попередній контейнер (docker stop my-rabbit і docker rm my-rabbit) і запустіть його знову, але спробуйте змінити порт адмінки на 8080 (щоб заходити на localhost:8080).

Завдання 2: Симуляція e-mail розсилки * Створіть чергу з назвою email_campaign. * Надішліть туди 3 повідомлення вручну. Нехай це будуть JSON-рядки: 1. {"to": "user1@gmail.com", "body": "Знижка 10%"} 2. {"to": "user2@yahoo.com", "body": "Ваш пароль змінено"} 3. {"to": "boss@company.com", "body": "Звіт готовий"} * Переконайтеся, що у черзі лежить саме 3 повідомлення.

Завдання 3: "А що, якщо..." (Durability) Це важливо. 1. Створіть чергу temp_queue. При створенні змініть параметр Durability (Живучість) на Transient (Тимчасова). 2. Створіть чергу perm_queue зі стандартним параметром Durable. 3. Перезавантажте контейнер RabbitMQ (docker restart my-rabbit). 4. Зайдіть в адмінку. Яка черга зникла, а яка залишилась? Чому це важливо для банківських транзакцій?

Завдання 4: Міні-кейс Уявіть, що ви обробляєте зображення (важка задача). * Створіть чергу image_processing. * Уявіть, що ви — Консьюмер. Зайдіть в Get messages, поставте галочку Ack Mode: Ack message requeue false (це означає "Я підтверджую, що забрав і обробив"). * Натисніть "Get". Чи зникло повідомлення з графіку "Ready"?


5. 💡 Мислення як у розробника

Як відрізнити новачка від профі в роботі з RabbitMQ?

1. Помилка новачка: "RabbitMQ — це база даних" Новачки іноді залишають повідомлення в черзі на тиждень, сподіваючись використати їх як архів. * Як думає профі: Черга має бути порожньою! Якщо в черзі росте кількість повідомлень — це "пожежа". Це означає, що ваші воркери (споживачі) не встигають. RabbitMQ — це труба, а не відро. Дані мають текти.

2. Безпека guest Користувач guest працює тільки з localhost. * Як думає профі: Як тільки я викладаю це на сервер, я створюю нового юзера, даю йому права і видаляю guest. Ніколи не залишайте дефолтні налаштування в продакшені.

3. Використання Docker Новачок буде мучитися з установкою Erlang на Windows. * Як думає профі: docker-compose up. Профі цінує свій час і відтворюваність середовища.


6. 🧩 Підсумок

Отже, що ми сьогодні зробили? 1. Ми зрозуміли, що синхронна робота (робити все відразу) — це шлях до повільних сайтів. 2. Ми дізналися, що RabbitMQ — це як поличка замовлень на кухні: дозволяє відкласти важкі задачі на потім. 3. Ми запустили сервер однією командою в Docker. 4. Ми навчилися створювати черги і відправляти повідомлення через адмінку.

Тепер ви вмієте піднімати інфраструктуру для асинхронних систем! 🎉

🔮 Що далі?

Натискати кнопки в адмінці весело, але ми ж програмісти! На наступному уроці ми візьмемо Python (або JS) і напишемо скрипт, який буде сам, автоматично, відправляти повідомлення в RabbitMQ, а інший скрипт буде їх ловити. Ми побудуємо свій міні-чат.

До зустрічі! Це був CS50... тобто, це був ваш урок про RabbitMQ! 👨‍💻👩‍💻