Использование ASA Amazon с несколькими потребителями
У меня есть приложение на основе сервисов, которое использует Amazon SQS с несколькими очередями и несколькими потребителями. Я делаю это так, чтобы я мог реализовать архитектуру на основе событий и отделить все сервисы, где разные службы реагируют на изменения состояния других систем. Например:
- Служба регистрации:
- Выдает событие "registration-new", когда регистрируется новый пользователь.
- Служба пользователя.
- При обновлении пользователя обновляется событие "обновлено пользователем".
- Служба поиска:
- Считывает из очереди 'registration-new' и индексирует пользователя в поиске.
- Считывает из очереди "обновляемый пользователем" и обновляет пользователя в поиске.
- Сервис показателей.
- Считывается из очереди 'registration-new' и отправляется в Mixpanel.
- Считывается из очереди "обновляется пользователем" и отправляется в Mixpanel.
У меня возникает ряд проблем:
- При проведении опроса сообщение может быть получено несколько раз. Я могу создать много систем, чтобы быть идемпотентными, но для некоторых сервисов (таких как служба показателей) было бы намного сложнее.
- Сообщение должно быть удалено вручную из очереди в SQS. Я думал о внедрении "службы обработки сообщений", которая обрабатывает удаление сообщений, когда все службы получили их (каждая служба будет выдавать сообщение "подтвержденное сообщением" после обработки сообщения).
Я предполагаю, что мой вопрос таков: какие шаблоны я должен использовать, чтобы гарантировать, что у меня может быть несколько потребителей для одной очереди в SQS, гарантируя, что сообщения также будут надежно доставлены и удалены. Благодарим вас за помощь.
Ответы
Ответ 1
Я думаю, что вы делаете это неправильно.
Мне кажется, что вы используете одну и ту же очередь, чтобы делать несколько разных вещей. Лучше использовать одну очередь для одной цели.
Вместо того, чтобы помещать событие в очередь "регистрация-новый" , а затем иметь две разные службы, опрошенные в этой очереди, и BOTH нужно читать это сообщение и делать с ним что-то другое (а затем нужен третий процесс, который предполагается для удаления этого сообщения после того, как другие 2 обработали его).
Одна очередь должна использоваться для одной цели.
-
Создайте очередь "индекс-пользовательский поиск" и очередь "отправить в микспанели",
поэтому служба поиска считывает из поисковых очередей, индексирует пользователя
и немедленно удаляет сообщение.
-
Служба mixpanel читает из очереди микширования, обрабатывает
сообщение и удаляет сообщение.
Служба регистрации вместо того, чтобы выпустить "registration-new" в одну очередь, теперь отправляет ее в две очереди.
Чтобы сделать это на один шаг лучше, добавьте SNS в микс здесь, и служба регистрации выдает сообщение SNS в тему "регистрация-новый" (не очередь), а затем подписаться на обе очереди, упомянутые выше, на эта тема в шаблоне "разветвления".
https://aws.amazon.com/blogs/aws/queues-and-notifications-now-best-friends/
Обе очереди получат сообщение, но вы только загрузите его в SNS один раз - если по дороге третье несвязанное обслуживание должно также обрабатывать события "регистрация-новый" , вы создаете еще одну очередь и подписываете ее также на эту тему - он может работать без каких-либо зависимостей или знаний о том, что делают другие службы - вот цель.
Ответ 2
Я хотел бы добавить то, что я прочитал в этом сообщении в блоге.
Когда исходное сопоставление источника событий SQS изначально создано и включено или когда сообщения впервые появляются после периода без трафика, служба Lambda начнет опрос очереди SQS, используя пять параллельных соединений с длинным опросом. Служба Lambda отслеживает количество сообщений в полете, и когда она обнаруживает, что это число имеет тенденцию к увеличению, она увеличивает частоту опроса на 20 запросов ReceiveMessage в минуту и параллелизм функции на 60 вызовов в минуту.
Если AWS Lambda может выполнять параллельную обработку SQS, то почему не могут домашние приложения?
Источник: https://aws.amazon.com/blogs/aws/aws-lambda-adds-amazon-simple-queue-service-to-supported-event-sources/