Как масштабировать очередь SQS FIFO для нескольких слушателей - PullRequest
0 голосов
/ 02 мая 2019

У меня есть три очереди SQS FIFO, в каждой из которых есть демон прослушивателя проекции данных в экземпляре EC2 в качестве модуля докера (SQL Server, PostgreSQL, Elastic Search и т. Д.)

Все очереди имеют те же настройки, что и ниже(Очереди недоставленных сообщений для настройки позже).

Queue Type: FIFO    
Messages Delayed:   0
Content-Based Deduplication:    Enabled
Default Visibility Timeout: 30 seconds
Message Retention Period:   14 days
Maximum Message Size:   256 KB

Это все часть архитектуры источников событий, которую я проектирую с использованием DynamoDB Stream => Lambda SQS Router => SQS FIFO Queues (из-за того, что SNS не поддерживаетОчереди FIFO в качестве подписчиков)

Content-Based Deduplication включен, чтобы избежать дублирования сообщений в очереди, поскольку в Lambda Router всегда возможна ошибка для любой из очередей.

Теперь у меня также естьустановите MessageGroupId для каждого сообщения в AggregateId, чтобы сгруппировать их, но на самом деле не понимаю, как это используется на стороне потребителя;

У меня только один потребитель на очередь SQS в данный момент, но что если яхочу масштабировать потребителей.Это приложение заботится о том, чтобы несколько потребителей не обрабатывали сообщения с одного и того же MessageGroupId;- что недопустимо, поскольку использование очередей FIFO связано с сохранением порядка событий в системе!

1 Ответ

1 голос
/ 03 мая 2019

Если сообщение было получено из очереди FIFO Amazon SQS, и оно все еще невидимо («в полете»), то SQS не предоставит другое сообщение с таким же MessageGroupId.

Следовательно,несколько потребителей в одной очереди получат сообщения с другим MessageGroupId, и порядок сообщений в пределах данного MessageGroupId будет сохранен.

Здесь важно использовать другое MessageGroupId там, где вы хотитесохранить порядок, но не использовать один и тот же MessageGroupId для каждого сообщения.

См .: AWS SQS FIFO - Как получить более 10 сообщений одновременно?

...