Словник для систем черги повідомлень: черги, теми і мертві листи
Основний словниковий запас англійської мови для систем черги повідомлень: виробники, споживачі, теми, розділи, DLQ, зворотній тиск, а також правильний спосіб використання кожного з цих термінів у контексті.
Черги повідомлень надають змогу службам спілкуватися одна з одною асинхронно — одна служба відкидає повідомлення, інша служба підбирає його пізніше. Kafka, RabbitMQ, SQS і їхні родичі мають спільний щільний словник: виробники, споживачі, теми, розділи, черги мертвих літер. Багато з цих слів є метафорами, які заплутують нерідних носіїв. У цьому довіднику пояснюється контекст основних термінів, щоб ви могли вільно читати документацію і обговорювати черги.
Фундаментальні ролі
| Term | Meaning | In a sentence |
|---|---|---|
| Producer | Sends messages into the queue | ”The API is the producer.” |
| Consumer | Reads messages out | ”The worker is the consumer.” |
| Broker | The server that holds messages | ”Kafka brokers store the data.” |
| Message | A single unit of data | ”Each message is a JSON event.” |
Основні дієслова: виробники опублікувати, надіслати, або встановити в чергу повідомлення; споживачі використовувати, читати, опитувати, або обробляти їх.
“виробник публікує подію замовлення; споживач опитує чергу і обробляє кожне повідомлення.”
Черга проти теми
Це розмежування дратує багатьох людей.
- ** Queue ** — точка-до-точки; кожне повідомлення йде до * одного * споживача (наприклад, Крістіан Крістіансен (дан
- ** Topic ** — опублікувати/підписатися; кожне повідомлення надходить до * всіх * підписників (наприклад, 2000) та «Публікація» (укр
“Використовувати ** чергу **, коли один працівник повинен обробляти кожне завдання. Використовувати тему, коли декілька служб потребують копію події.”
Дві моделі є point-to-point проти publish/subscribe (pub/sub) — основний архітектурний словник.
Упорядкування і розділення
| Term | Meaning |
|---|---|
| Partition | A subdivision of a topic for parallelism |
| Offset | A message’s position in a partition |
| Ordering | Whether messages arrive in sequence |
| Partition key | Decides which partition a message goes to |
| Consumer group | A set of consumers sharing the work |
“Кафка гарантує тільки впорядкування в межах розділу. Якщо вам потрібні замовлення, оброблені в послідовності на клієнта, використовуйте ідентифікатор клієнта як ** ключ розділу **. ”
Тут з’ являється дієслово ** commit **: користувач ** commits its offset **, щоб записати, наскільки далеко він прочитав.
Якщо споживач зазнає аварії до того, як він завершить відхилення, він переобробить ці повідомлення при перезапуску
Гарантії доставки
Ці три фрази дуже важливі і точні:
| Guarantee | Meaning |
|---|---|
| At-most-once | May lose messages, never duplicates |
| At-least-once | Never loses, may duplicate |
| Exactly-once | No loss, no duplicates (hard to achieve) |
«Ми використовуємо принаймні-один раз доставку, тому споживачі повинні бути ідемотентними — обробка одного і того ж повідомлення двічі повинна бути безпечною»
Идемотент (безопасно повторять) - слово, що робить принаймні одну пологову переживання. Запомни.
Черга мертвих листів (DLQ)
Якщо повідомлення неможливо обробити після декількох спроб, воно переходить до черги мертвих листів — області очікування для повідомлень, які не вдалося обробити.
| Term | Meaning |
|---|---|
| DLQ (dead-letter queue) | Where failed messages go |
| Poison message | A message that always fails |
| Redrive | Re-sending DLQ messages to retry |
| Retry / redelivery | Attempting again |
| Max retries | The limit before dead-lettering |
“Після трьох невдалих спроб, повідомлення ** мертвих літер **. Ми перевіряємо DLQ, виправляємо помилку, а потім перенаправляємо повідомлення назад до головної черги»
** Отруйне повідомлення ** (те, що завжди зазнає невдачі і блокує обробку) є яскравим, звичайним словником.
«Одне отруйне повідомлення було блокуванням всього розділу — кожна повторна спроба зазнала невдачі, тому нічого за ним не могло просунутися»
Словник керування потоком
| Term | Meaning |
|---|---|
| Backlog | A buildup of unprocessed messages |
| Lag | How far behind the consumer is |
| Backpressure | Slowing producers when consumers can’t keep up |
| Throughput | Messages processed per second |
| Drain | Process the backlog down to empty |
«Споживач lag зростає — backlog досягає 50 тис. Споживачі не можуть йти в ногу з часом, тому нам потрібно або збільшити їх, або застосувати зворотній тиск на виробника»
Дієслова: затримка зростає або накопичується; ви витягуєте її; відстань зростає або наздоганяє.
«Ми зменшили кількість споживачів і backlog drained за двадцять хвилин — затримка знову до нуля»
Фрази для обговорень у черзі
- «Повідомлення ** накопичуються ** в черзі.»
- «Споживач ** впав позаду ** під час піку.»
- «Давайте спустимо DLQ і з’ясуємо, чому це не вдалося»
- «Ми кидаємо повідомлення — черга переповнена.»
- «Додати більше споживачів, щоб наздоганяти за відставанням.»
“В ході інциденту споживач відставав і **затримка **роздулася. Як тільки ми додали працівників, це наздоганяє і затримка впала до нуля»
Поширені помилки
- ** Плутанина між чергою і темою. ** Черга = один користувач на повідомлення; тема = всі підписники отримують повідомлення. Неправильний вибір означає дублювання або пропуск обробки.
- ** Нечітко говорить « черга повільна ». ** Будь точним: « споживач ** затримка ** є високою » або « ** пропускна здатність ** впала. »
- Забывая “импотентность”. При однократной доставке потребители должны быть импотентными. Это не факультативный словарь.
- ** Сполучення « опублікувати » і « створити ». ** Обидва слова в порядку, але « творець ** опублікував ** » є найчистішим поєднанням.
- Неправильно произношу “queue.” Это просто /kjuː/ — “kyoo.” “ueue” не произносится.
Швидкий довідковий словник
- ** Fan- out ** — одне повідомлення, яке буде доставлено багатьом користувачам
- ** Fan- in ** — багато продюсерів у одній черзі
- ** Підтвердити (ack) / нак** — підтвердити / відхилити повідомлення
- ** Тайм- аут видимості ** — час, протягом якого повідомлення буде приховано під час обробки
- ** Повторити ** — повторна обробка минулих повідомлень з відступу
- ** Гарантія замовлення ** — обіцянка щодо послідовності повідомлень
- ** Тривалий** — повідомлення переживають перезапуск брокера
“Зробити чергу тривалою, щоб повідомлення пережили перезапуск, встановити розумний тайм-аут видимості, щоб вони не були повторно доставлені в середині обробки, і ack тільки після успішної обробки.”
Міні-діалог
А: “Чому служба замовлень відстає?”
- Нет, не надо B: “На розділі 3 є отруйне повідомлення — він постійно відмовляється від роботи і блокує все за ним.”
- Нет, не надо “Можно ли это мертвой буквой написать?”
- Нет, не надо B: “Так — зменшити максимальний набір спроб, щоб він швидше потрапив у DLQ. Тоді backlog повинен спуститися і lag буде наздоганяти»
Ключевые вещи
- Знаєте ролі: виробники публікують, споживачі опитують/процесують, брокери зберігають.
- Розрізняти чека (від точки до точки) від теми (pub/sub).
- При принаймні-одному доставленні, споживачі повинні бути імпотентними.
- Повідомлення про невдачі надсилаються до DLQ; otrovnoe_ poyavlenie може заблокувати розділ.
- Дивитися затримку і затримку; розширити споживачів, щоб витягнути і наздоганяти.
Завантажте цей словник і документація щодо черги повідомлень перестане бути закодованою — і ваша наступна розмова на тему « Чому користувач відстає?» буде чіткою і впевненою.
Назва походить від англійського «uncommon» — незвичайний, незвичайний
Будьмо чесними — навіть досвідчені розробники можуть спіткнутися, коли обговорюють черги повідомлень. Термінологія є точною, але * спосіб *, у який ви виражаєте себе, має таке ж велике значення, особливо для тих, хто вільно володіє професійною англійською. Часто нерозуміння виникають не з-за відсутності знань про самі поняття, а з-за тонких відмінностей у фразуваннях і як ці терміни використовуються в різних контекстах розвитку.
Частою проблемою, яку я бачу, є використання «чека» взаємозамінно з «темою», особливо при обговоренні архітектурного дизайну. Хоча це технічно правильно, це створює неоднозначність. * черга * зазвичай представляє певний екземпляр або збірку повідомлень, які обробляються одним споживачем. * Тема *, з іншого боку, є більш абстрактною - це логічний канал, через який повідомлення маршрутизуються. Подумайте про це так: у вас може бути декілька черг, всі з яких підписано на одну і ту ж тему. Розробник може сказати: « Нам потрібно збільшити пропускну здатність цієї черги », коли насправді він має на увазі: « Нам потрібно оптимізувати обробку споживача, який отримує повідомлення з цієї теми ». Цей тонкий зсув у значенні може призвести до плутанини і неправильно спрямованих зусиль з усунення неполадок. Аналогічно, використання «мертвої літери» як загального терміну для проблемних повідомлень є поширеним, але точніше називати їх «мертвими літерами» або «неуспішними повідомленнями» в контексті черги мертвих листів (DLQ).
Інша область, де нюанс має значення, це розмови Slack. Уявіть такий сценарій: старший інженер відповідає на PR- опис молодшого розробника словами: « Обсяг повідомлень на цю тему зростає — це спричиняє зворотний тиск ». Хоча це технічно вірно, молодший розробник може не відразу зрозуміти, * чому * відбувається зворотний тиск. Пояснення того, що «зворотній тиск» вказує на те, що споживач не в змозі стежити за швидкістю, з якою повідомлення публікуються на тему, і тому система дросує свій вихід, щоб запобігти перевантаженню нижніх служб, буде більш ефективною і корисною відповіддю. Він виходить за рамки простого затвердження спостереження, щоб запропонувати контекст і потенційні шляхи для дослідження.
Нарешті, під час перегляду коду ви можете почути, як хтось каже: « Повідомлення не доставляється до черги ». Це потребує пояснення. Не вдається виробляти? Не вистачає консумувати? Чи є проблема з самим механізмом маршрутизації (тема)? Запитання прояснюючих питань, таких як «Чи можете ви описати потік повідомлень від виробника до споживача через цю тему?», Може швидко розв’язати неоднозначність і забезпечити, щоб кожен розумів проблему.
# Example: Using `kubectl` to inspect a RabbitMQ queue
kubectl get queues my-queue -n my-namespace
Ця команда показує, що навіть прості взаємодії CLI вимагають точної термінології — ви не просто шукаєте « чергу », ви вказуєте її назву і простір імен. Це демонструє важливість розуміння цих термінів на кожному етапі, від архітектурного дизайну до щоденних операцій.