Черги чи теми: вибираємо правильний шаблон обміну повідомленнями в Azure Service Bus
By Mirko Peters ·
Ласкаво просимо назад до супровідного блогу подкасту! У нашому останньому епізоді ми детально розглянули базові елементи хмарного обміну повідомленнями. Якщо ви ще не мали нагоди…
Automatically translated with AI from the original post. Read the English original

Ласкаво просимо назад до супровідного блогу подкасту! В останньому епізоді ми детально розглянули базові елементи хмарного обміну повідомленнями. Якщо ви ще не встигли його послухати, обов’язково перегляньте епізод Azure Service Bus - Simply Explained. Сьогодні ми поговоримо докладніше про одне з найважливіших архітектурних рішень, які вам доведеться ухвалити під час створення розподілених застосунків: вибір між чергами та темами Azure Service Bus. Розуміння тонкощів цих двох шаблонів обміну повідомленнями допоможе вам проєктувати більш стійкі, масштабовані та легкі в супроводі системи.
Вступ до Azure Service Bus і шаблонів обміну повідомленнями
Оскільки сучасні застосунки відходять від монолітних архітектур до розподілених, побудованих на мікросервісах, потреба в надійній взаємодії стає першочерговою. Сервіси не можуть покладатися лише на синхронні HTTP-виклики для всього: це створює щільну зв’язаність, каскадні збої та вузькі місця продуктивності. Саме тут на допомогу приходять хмарні брокери повідомлень.
Azure Service Bus є повністю керованим корпоративним брокером повідомлень, який роз’єднує застосунки та сервіси. Надсилачі можуть передавати повідомлення, не знаючи, хто є отримувачем і чи він взагалі зараз онлайн. Завдяки цьому Azure Service Bus забезпечує високу доступність і плавне вирівнювання навантаження. Проте щойно ви вирішуєте використовувати Azure Service Bus, перед вами постає ключове архітектурне питання: чи потрібна мені черга, чи тема?
Що таке Azure Service Bus?
Перш ніж розбиратися у відмінностях між чергами та темами, варто чітко уявити, що саме робить Azure Service Bus. По суті, Azure Service Bus є брокером повідомлень, який надійно зберігає повідомлення в просторі імен, доки застосунок-отримувач не буде готовий їх обробити. Він пропонує надійні функції, зокрема гарантії доставки «принаймні один раз», управління сеансами, переміщення в мертву чергу та відкладену доставку повідомлень.
У хмарному середовищі Azure Service Bus з’єднує різні компоненти вашого застосунку. Обробляєте ви замовлення електронної комерції, телеметрію Інтернету речей (IoT) чи інтеграції систем планування ресурсів підприємства (ERP), Service Bus забезпечує надійність і можливості асинхронної обробки, потрібні для того, щоб дані безперебійно надходили.
Черги чи теми: ключовий архітектурний вибір
Фундаментальна відмінність між чергами та темами зводиться до шаблону обміну повідомленнями, який вони підтримують: «точка-точка» проти «публікація/підписка». Неправильний вибір шаблону може згодом призвести до переробки архітектури, проблем із дублюванням даних або вузьких місць масштабованості.
Черга забезпечує модель зв’язку «один до одного». Коли ви надсилаєте повідомлення в чергу, його прочитає і обробить рівно один споживач. Натомість тема забезпечує модель «один до багатьох». Коли ви публікуєте повідомлення в темі, воно розподіляється між кількома підписками, що дозволяє кільком незалежним downstream-сервісам отримати й обробити копію того самого повідомлення.
Вибір між цими двома шаблонами повністю залежить від ваших бізнес-вимог. Чи є у вас одне навантаження, яке потрібно розподілити між робочими екземплярами для балансування, чи кілька різнорідних систем, які мають реагувати на одну бізнес-подію?
Детальний огляд черг Service Bus
Черги Service Bus є робочими конями традиційного корпоративного обміну повідомленнями. Вони призначені для сценаріїв, де одне завдання має виконуватися один раз і лише один раз пулом робочих процесів.
Коли ви надсилаєте повідомлення в чергу, воно чекає там, доки його не забере отримувач. За замовчуванням черги забезпечують строгий порядок доставки «першим прийшов — першим вийшов» (FIFO). Тому черги ідеально підходять для архітектур, керованих командами, де важливий порядок, наприклад для обробки платіжних транзакцій або виконання послідовних кроків робочого процесу.
Крім того, черги чудово вирівнюють навантаження. Якщо ваш застосунок зазнає різкого сплеску трафіку, вхідні запити можуть безпечно накопичуватися в черзі, не перевантажуючи серверні обчислювальні ресурси. Робочі сервіси потім можуть забирати повідомлення з черги у стабільному, рівномірному темпі.
Детально про теми та підписки
Черги підходять для простої доставки «точка-точка», а теми відкривають можливості архітектур публікації та підписки (pub/sub). Тема є кінцевою точкою для надсилання повідомлень, але сама по собі не може зберігати повідомлення без підписок.
Уявіть підписку як віртуальну чергу, прикріплену до теми. Коли повідомлення публікується в темі, копія цього повідомлення доставляється до кожної активної підписки. Кожна служба-споживач створює власну підписку на тему, тож вони можуть обробляти повідомлення незалежно одна від одної.
Наприклад, розглянемо подію розміщення замовлення на платформі електронної комерції. Коли клієнт робить замовлення, система публікує повідомлення OrderPlaced у темі. Служба складського обліку має підписку для оновлення залишків, служба виставлення рахунків має підписку для обробки платежу, а служба сповіщень має підписку для надсилання електронного чека. Усі три системи отримують подію одночасно і не заважають одна одній.
Фільтрація повідомлень і гнучкість
Однією з найпотужніших можливостей тем Azure Service Bus є фільтрація повідомлень. У багатьох сценаріях pub/sub підписника не цікавить кожне повідомлення, опубліковане в темі; його цікавить лише певна частина даних.
Azure Service Bus дозволяє визначати правила та фільтри для підписок за допомогою синтаксису, схожого на SQL, або властивостей correlation. Наприклад, можна налаштувати підписку так, щоб вона отримувала лише повідомлення, де властивість Region дорівнює NorthAmerica, або де OrderAmount перевищує певний поріг.
Ця можливість фільтрації економить мережевий трафік і гарантує, що споживачі обробляють лише дані, релевантні для них, суттєво знижуючи непотрібні витрати обчислювальних ресурсів.
Обробка збоїв за допомогою черг недоставлених повідомлень
Незалежно від того, використовуєте ви черги чи теми, розподілені системи схильні до збоїв. Що відбувається, коли повідомлення має неправильний формат, база даних, з якою працює застосунок, стає недоступною або застосунок раз за разом аварійно завершується під час обробки конкретного повідомлення?
Azure Service Bus елегантно вирішує це за допомогою черг недоставлених повідомлень (Dead-Letter Queues, DLQ). Кожна черга та кожна підписка теми мають пов’язану допоміжну чергу, яка називається чергою недоставлених повідомлень. Якщо обробка повідомлення не вдається занадто багато разів (перевищено максимальну кількість спроб доставки) або строк його дії минає, Service Bus автоматично переносить це повідомлення до DLQ.
Цей механізм ізолює «отруйні повідомлення», щоб вони не блокували основний конвеєр обробки. Інженери можуть переглянути DLQ, проаналізувати причину збою, виправити основну помилку, а потім повторно надіслати повідомлення назад до основного робочого процесу для успішної обробки.
Найкращі практики проєктування розподілених застосунків
Щоб максимально ефективно використовувати реалізацію Azure Service Bus, важливо дотримуватися усталених архітектурних найкращих практик:
- Ізолюйте середовища: використовуйте окремі простори імен Service Bus для середовищ розробки, тестування та продуктивного середовища, щоб запобігти поширенню збоїв між середовищами.
- Впроваджуйте інфраструктуру як код: описуйте черги, теми, підписки та фільтри за допомогою шаблонів ARM, Bicep або Terraform, щоб забезпечити однакові розгортання.
- Встановлюйте відповідні політики збереження: налаштовуйте час життя повідомлень (TTL) і тривалість блокування відповідно до реальних бізнес-потреб, а не покладайтеся на максимальні значення за замовчуванням.
- Здійснюйте моніторинг і сповіщення: використовуйте Azure Monitor та Application Insights для відстеження таких метрик, як кількість повідомлень, активні повідомлення в DLQ та затримка сервера.
Висновок: вибір правильного шаблону для вашої архітектури
Вибір правильного шаблону обмін повідомленнями в Azure Service Bus є основою для створення стійких, масштабованих хмарних застосунків. Використовуйте черги, коли вам потрібен надійний механізм «один до одного» типу точка-точка для балансування навантаження та послідовної обробки завдань. Обирайте теми та підписки, коли потрібна модель публікації та підписки для розсилки подій кільком незалежним системам.
Щоб почути більше обговорень про хмарну архітектуру, безпеку та сучасні шаблони розробки, обов’язково послухайте повний епізод: Azure Service Bus - Simply Explained. Правильна інтеграція цих шаблонів обміну повідомленнями гарантуватиме, що ваші хмарні застосунки залишаться надійними, адаптивними та готовими до масштабування під будь-яким навантаженням.