Триггер лямбда по количеству сообщений SQS - PullRequest
0 голосов
/ 28 февраля 2019

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

И у меня есть вариант использования, если число сообщений в очереди достигает X числа (например, 1000)система должна инициировать событие для обработки 1000 одновременно.

И система создаст кусок триггеров, каждый триггер имеет 1000 сообщений.

Например, если мы имеем2300 сообщений в очереди, мы ожидаем 3 триггера для лямбда-функции, 2 первых триггера, соответствующих 10000 сообщений, последнее будет содержать 300 сообщений.

Я занимаюсь исследованием и вижу, что CloudWatch Alarm может подключиться кМетрика SQS для NumberOfMessageReceived для отправки в SNS.Но я не знаю, как мне настроить блок аварийных сигналов для каждых 1000 сообщений.

Пожалуйста, сообщите мне, может ли AWS поддержать этот вариант использования или какие-либо настройки, которые мы можем сделать для достижения этой цели.

enter image description here

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Итак, пройдя некоторые разъяснения в разделе комментариев с помощью OP, вот мой ответ (в сочетании с комментарием @ ChrisPollard):

Достижение того, что вы хотите с помощью SQS, невозможно, поскольку каждая партия может содержать толькодо 10 сообщений.Поскольку вам нужно обрабатывать 1000 сообщений одновременно, это определенно не требуется.

@ ChrisPollard предложил создавать новую запись в DynamoDB каждый раз, когда новый файл помещается на S3.Это очень хороший подход.Увеличивайте ключ разделения на 1 каждый раз и запускайте лямбду через DynamoDB Streams .В вашей функции запустите проверку ключа раздела и, если он равен 1000, выполните запрос к таблице DynamoDB, отфильтровав последние 1000 обновленных элементов (вам потребуется глобальный вторичный индекс в поле CreatedAt).Сопоставьте эти элементы (или используйте Projection ), чтобы создать очень минимальный JSON, который содержит только необходимую информацию.Примерно так:

[
    {
     "key": "my-amazing-key",
     "bucket": "my-super-cool-bucket"
    },
    ...
]

JSON, подобный этому, имеет длину всего 87 байтов (если вы уберете квадратные скобки из игры, потому что они не будут повторяться, у вас останется 83 байта).Если вы округлите его до 100 байт, вы все равно сможете успешно отправить его как одно событие в SQS, так как он будет содержать только около 100 КБ данных.

Затем одна Lambda-функция подпишется на вашу очередь SQS и, наконец, наконецобъединить 1 тысячу файлов.

Имейте в виду:

  1. Убедитесь, что вы действительно создали поле createAt в DynamoDB.К тому времени, когда он достигнет одной тысячи, новые элементы могли быть вставлены, так что таким образом вы убедитесь, что читаете 1000 ожидаемых вами элементов.

  2. В проверке Lambda просто запуститеbatchId% 1000 = 0, поэтому вам не нужно ничего удалять, сохраняя операции DynamoDB.

  3. Следите за временем выполнения вашей лямбды.Объединение 1000 файлов за один раз может занять некоторое время, поэтому я бы запустил пару тестов и поставил на них 1 мин.То есть, если это обычно занимает 5 минут, установите время ожидания вашей функции на 6 минут.

Если у вас есть новая информация для обмена, я с удовольствием отредактирую свой ответ.

0 голосов
/ 28 февраля 2019

Вы можете добавить сигналы тревоги в 1k, 2k, 3k и т. Д., Но это кажется неуклюжим.

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

...