16

У меня есть сервис-приложение, которое использует Amazon SQS с несколькими очередями и несколькими потребителями. Я делаю это так, чтобы я мог реализовать архитектуру на основе событий и отделить все сервисы, где разные службы реагируют на изменения состояния других систем. Например:Использование Amazon SQS с несколькими потребителями

  • регистрационная служба:
    • эмитирует события «регистрация новой», когда новый пользователь регистрируется.
  • Услуги Пользователь:
    • Издает событие 'пользователь обновляемый', когда пользователь обновляется.
  • Служба поиска:
    • Считывает из очереди 'учетно-новый' и индексы пользователей в поиске.
    • Считывает из очереди «обновленный пользователь» и обновляет пользователя в поиске.
  • Метрики Сервис:
    • Считывает из 'учетно-новой' очереди и посылает Mixpanel.
    • Считывается из очереди «обновляется пользователем» и отправляется в Mixpanel.

У меня ряд вопросов:

  • Сообщение может быть получены несколько раз при выполнении опроса. Я могу создать много систем, чтобы быть идемпотентными, но для некоторых сервисов (таких как служба показателей), которые были бы намного сложнее.
  • Сообщение должно быть удалено вручную из очереди в SQS. Я подумал о внедрении «службы обработки сообщений», которая обрабатывает удаление сообщений, когда все службы получили их (каждая служба будет выдавать сообщение «подтвержденное сообщением» после обработки сообщения).

Я думаю, мой вопрос таков: какие шаблоны я должен использовать, чтобы гарантировать, что у меня может быть несколько потребителей для одной очереди в SQS, гарантируя, что сообщения также будут надежно доставлены и удалены. Спасибо за помощь.

ответ

22

Я думаю, что вы делаете это неправильно.

Мне кажется, что вы используете одну и ту же очередь, чтобы делать несколько разных вещей. Лучше использовать одну очередь для одной цели.

Вместо того, чтобы помещать событие в очередь «регистрация-новый», а затем иметь две разные службы, опрос которых находится в очереди, а ОБОИХ необходимо прочитать это сообщение и сделать с ним что-то другое (а затем понадобится третий процесс, который должен удалить это сообщение после того, как другие 2 обработали его).

Одна очередь должна использоваться для одной цели.

  • Создать «индекс-пользователь поиск» очередь и «отправить mixpanels» очередь, поэтому служба поиска считывает из очередей поиска, индексирует пользователь и немедленно удаляет сообщение.

  • Служба mixpanel считывает из очереди микшерных панелей, обрабатывает сообщение
    и удаляет сообщение.

Служба регистрации, вместо того чтобы издавать «регистрацию-новую» в одну очередь, теперь отправляет ее в две очереди.

Чтобы сделать это на один шаг лучше, добавьте SNS в микс здесь, и служба регистрации выдает сообщение SNS в тему «регистрация-новое» (а не очередь), а затем подписаться на обе очереди, о которых я упоминал выше, к этой теме в шаблоне «разветвления».

https://aws.amazon.com/blogs/aws/queues-and-notifications-now-best-friends/

Обе очереди получит сообщение, но вы только загрузить его в ОСН один раз - если вниз по дороге третья несвязанная служба должна также процесс «регистрация новой» событие, вы создаете другую очередь и подписаться он также относится к этой теме - он может работать без каких-либо зависимостей или знаний о том, что делают другие службы - вот в чем цель.

+0

Это идеальное решение. Я не знал, что вы можете сделать это с SNS! Спасибо! – user2205763

Смежные вопросы