Привет! Может у кого есть идеи как сделать: - у нас

есть микросервис который публикует мессаджи в SNS, и из SNS они направляются в очередь (SQS)
- эту очередь слушает другой микросервис (Lambda), который их процессит, во время процессинга он использут одно API, которое лучше не дергать более 60 раз в минуту
- если от первого микросервиса прилетает слишком много мессаджей (бывает что их генерится 500 в минуту) - то нам нужно как-то “притормозить” чтобы “слушающий” микросервис процессил их не все сразу, а по 30-60 в минуту

Варианты решения:
- ставить custom random delay во время отправки сообщения в SNS - к сожалению невозможно, custom delay опция есть только если шлешь напрямую в SQS (sqs.sendMessage) а в SNS такого нет (sns.publish)
- поставить concurrency limit у второго микросервиса в 1 - у меня почему-то в результате 1 мессадж оказался в deadletter queue, ну и concurrency=1 не гарантирует что оно в минуту не сделает больше 60

Я перетестирую сегодня с concurrency=1 но все равно это не идеально, - как можно притормозить получение мессаджей из SNS/SQS?

4 ответов

13 просмотров

Привет! Я похожую проблему решал через написание сервиса на питоне, правда сервис ещё смотрел на другие SQS очереди и в зависимости от того насколько они загружены слал или тормозил отправку. Для лямбды мне тоже интересно как это можно сделать, как вариант сделать что-то типа счетчика отправок в динаме и если лимит достигнут, то лямбда должна подождать. Но это костыль) С concurrency у меня тоже не пошло, лямбды под нагрузкой троттлят и падают.

Andrey Terekhov
Привет! Я похожую проблему решал через написание с...

Как вариант, если лимит отправки во второй микросервис исчерпан, то можно сделать change_message_visibility у сообщения в sqs и выходить из лямбды. То есть сделать сообщение недоступным на какой-то интервал и когда оно вернётся заново попробовать его обработать.

А нельзя написать старый добрый сервис на условном ec2/ecs который будет обрабатывать очередь с комфортной скоростью?

Сходу вижу два варианта: 1) настройка sqs event source для lambda function. Нужно выбрать подходящие значения для группировки сообщений - batch size и batch window

Похожие вопросы

Обсуждают сегодня

Кто хочет поиграться в легкий взлом специально уязвимого приложения? :) Ваше задани - вы студент группы 416 - оценку в 100 баллов и найти 10 флагов (текстовых) формата Step0...
Andrii Kurdiumov
4
Привет Хочу сделать аналог iCloud’а для своих проектов, чтобы пользовательская информация хранилась в облаке, была доступна во всех сервисах, её можно было подсасывать везде)...
Виталий
9
код Event::listen('cms.page.display', function (&$content, $slug, $page, $html) { if (is_object($content)) { dump($content); } else { dump($s...
Point 111
3
<div class="report-widget"> <h3 style="margin-bottom:10px;"> <?= e(__($this->property('title'))) ?> </h3> <button type="submit" data-request-flash ...
Vladimir 
2
Точно проблема в твиге?
Vladimir 
5
Ребят, а почему вызов add-tag может возвращать не нулевой код даже если операция прошла успешно? Дело в том, что образ корректно помечается, но ветка заходит в "then"... gclou...
Philipp Bondarev
2
Всем привет. Не понимаю, в чём тут шутка юмора. Убирается только разрешение на send_messages. А send_media_messages остаётся. Как сделать, чтобы оба убирались? await b...
Alexander
2
<div class="report-widget"> <h3 style="margin-bottom:10px;"> <?= e(__($this->property('title'))) ?> </h3> <button type="submit" data-control="popup...
Point 111
1
@LeMaX10 а ты же делаешь в своем боте капчу на вход в чат? или так же на первое сообщение?
Sergey
4
Ребята привет. Telegraf 3.38 актуален ещё или лучше обновиться?
𝙊𝑙ẽ𝘨 // Rabbit Hole
2
Карта сайта