Як я можу налаштувати абонентів MQTT на основну та відмовну роботу для черги на роботу з AWS IoT?


11

У мене є система, де клієнт (назвемо його ClientA) може публікувати запити на певну тему MQTT. Брокер, якщо це має значення, є Amazon Web Services. Тоді у мене є інший клієнт (назвемо це MainSubscriber), який завжди підписаний на одну і ту ж тему, щоб він міг забрати запити від ClientA і виконати певну роботу, яка, врешті-решт, перетворюється на роботу з базою даних. База даних, якщо це має значення, є DynamoDB.

Оскільки MainSubscriber може бути не завжди доступним / в Інтернеті, існує бажання, щоб підписник з відмовою не був резервним копією основного абонента. Ідея полягає в тому, що якщо основний абонент не звертається із запитом своєчасно, тоді абонент, який перебуває в режимі відмови, би кинувся і виконав еквівалентну роботу / роботу з базою даних. Проблема полягає в тому, що "робота" та отримана в результаті "операція з базою даних" не повинні дублюватися як основними, так і відмовними абонентами.

Ось логічний малюнок архітектури системи для цієї системи.

                   -----> MainSubscriber ----
                  /                          \
ClientA --> Broker                            ---> Database
                  \                          /
                   ---> FailoverSubscriber --

Зрозуміло, що з такою системою є деякі проблеми:

  1. Як основний абонент вказує передплатнику, який працює на відмову, що працює над запитом?
  2. Як підписка на відмову виявляє, що основний абонент не взяв запит і йому потрібно розпочати роботу над ним?
  3. Як тоді абонент, який перебуває в режимі відмови, відтримує основного абонента, якщо він раптом повернеться в Інтернет і забирає запит?
  4. Як вирішувати проблеми синхронізації між основними або аварійними абонентами?

Я б не хотів би винаходити колесо, якщо вже існує рішення для такої схеми. Отже, моє перше питання - чи є вже щось там?

Якщо ні, то я думав використати DynamoDB із сильно послідовними читаннями, щоб діяти як посередник між основним або відмовленим абонентом. Отже, моє друге питання - чи існують чітко встановлені схеми для цього?


Чи досліджували ви, чи може тут бути корисною черга повідомлень, як Amazon SQS ? Здається, є інтеграція з AWS IoT і виглядає придатною для проблеми стилю "робочої черги".
Aurora0001

Відповіді:


8

Відповідно до документації AWS SQS (як ви сказали, брокер AWS), це має бути рідним:

Відразу після отримання повідомлення воно залишається в черзі. Щоб запобігти іншим споживачам повторно обробляти повідомлення, Amazon SQS встановлює час очікування видимості, період часу, протягом якого Amazon SQS заважає іншим спожиючим компонентам отримувати та обробляти повідомлення.

Проблема в пошуку потрібного тайм-ауту видимості відповідно до максимального часу обробки.

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


7

Ви можете поглянути на концепцію чергових черг AWS SQS . З документів AWS:

Черга з мертвими літерами - це черга, на яку можуть націлювати інші (джерельні) черги для повідомлень, які не можуть бути успішно оброблені (спожиті). Ви можете відкласти та ізолювати ці повідомлення у черзі мертвих літер, щоб визначити, чому їх обробка не вдалася.

Отже, якщо ви вкажете основного абонента на прослуховування зі звичайної черги, а вторинного абонента - прослуховування з чергової літери черги, проблему відмови слід вирішити.

Також цим вирішуються 1, 2 і 3 ваших проблем. Основним та другорядним абонентам у цьому випадку не потрібно спілкуватися один з одним.

Крім того, спираючись на відповідь Tensibai, переконайтеся, що ваш код підписки написаний таким чином, щоб отримувати одне повідомлення одночасно, якщо кілька абонентів прослуховують одну і ту ж чергу черезvisibility timeout


Недоліком було б те, що воно вводить затримку в обробці, повідомлення надходять у чергу мертвих літер лише через деякий час.

Отже, якщо ви цього не хочете, то можете продовжити відповідь Тенсібая. І якщо ви можете терпіти це, замість того, щоб мати додаткову таблицю "Динамо" для перевірки статусу, ви можете використовувати це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.