Настройка AWS SQS и SNS: очереди, уведомления и отказоустойчивость

Когда очередь сообщений настроена неправильно, потери данных и дублирование становятся рутиной, а стоимость обработки растёт. Мы настраиваем AWS SQS и SNS так, чтобы сообщения доставлялись надёжно, а отказоустойчивость была заложена в архитектуру. Наша команда реализует проект под ключ — от аудита текущей схемы до внедрения и последующей поддержки.
Часто задаваемые вопросы

Настройка AWS SQS / SNS для очередей и уведомлений

Отметим: когда очередь сообщений настроена неправильно, потери данных и дублирование становятся рутиной. На одном проекте Standard очередь с VisibilityTimeout 30 секунд обрабатывала видео по 5 минут — сообщение перечитывалось 10 раз, забивая логами и увеличивая стоимость в 3 раза. Мы исправляем такие конфигурации уже более пяти лет: проектируем SQS и SNS так, чтобы backlog не рос, а сообщения доставлялись ровно один раз.

Какие проблемы решаем?

Почему Standard или FIFO?

Standard Queue — at-least-once, порядок не гарантирован, throughput почти неограничен. Подходит для email, обработки изображений, индексации. Дублирование возможно — потребитель должен быть идемпотентным.

FIFO Queue — exactly-once, порядок внутри Message Group. Throughput: 300 TPS без batching, 3000 TPS с batching (batch size 10). Имя заканчивается на .fifo. Нужен MessageGroupId при отправке. Не используйте FIFO там, где достаточно Standard — это лишние ограничения. На практике Standard в 2 раза быстрее FIFO при одинаковой нагрузке на CPU.

Параметр Standard FIFO
Доставка at-least-once exactly-once
Порядок не гарантирован гарантирован внутри группы
Throughput неограничен 300/3000 TPS
Дубликаты возможны исключены

Как избежать дублирования через VisibilityTimeout?

После ReceiveMessage сообщение скрыто на VisibilityTimeout (по умолчанию 30 с). Если потребитель не вызвал DeleteMessage — оно становится видимым для повторной обработки. Типичная ошибка: таймаут меньше времени обработки. Например, обработка видео 5 минут, таймаут 30 с — задача запускается десятки раз параллельно. Правило: таймаут ≥ max(время обработки) * 1.5. Для непредсказуемых задач используйте ChangeMessageVisibility для продления.

Long Polling (WaitTimeSeconds: 20) обязателен. Short polling проверяет только часть серверов — пустой ответ при непустой очереди. Согласно документации AWS, Long Polling снижает количество API-вызовов до 30–40%.

Как настроить Dead-Letter Queue?

DLQ — отдельная очередь для сообщений после N неудачных попыток. maxReceiveCount = 3–5. Без DLQ сломанное сообщение будет бесконечно крутиться в очереди, блокируя FIFO или тратя ресурсы. Dead-Letter Queue обязательно мониторить: CloudWatch Alarm на ApproximateNumberOfMessagesVisible > 0 — сигнал о проблемах в потребителях. Получите консультацию по настройке DLQ у наших инженеров.

Как работает Long Polling и зачем его включать?

Long Polling уменьшает задержку и количество пустых ответов. При WaitTimeSeconds = 20 запрос висит до 20 секунд, пока не появится сообщение. Это снижает нагрузку на сеть и стоимость API-вызовов. Включить можно через консоль или SDK — QueueAttributeName: 'ReceiveMessageWaitTimeSeconds'. Без Long Polling пустые ответы могут составлять до 90% запросов — лишние расходы.

Fan-out через SNS: рассылка событий нескольким потребителям

SNS топик → несколько SQS очередей: одно событие order.created параллельно обрабатывается billing, notification, inventory. Каждый сервис — в своём темпе. Важно: Access Policy SQS должна разрешать sns:SendMessage. Message Filtering — подписчик получает только нужные события, например, по региону. Это снижает нагрузку без лишнего кода.

{
  "FilterPolicy": {
    "event_type": ["order.created", "order.cancelled"],
    "priority": [{"numeric": [">=", 5]}]
  }
}

Lambda как потребитель SQS

Event Source Mapping управляет polling и масштабированием. Максимальный batch size: 10000 для Standard, 10 для FIFO. ReportBatchItemFailures — используйте всегда. При ошибке одного сообщения возвращаются только неудачные, остальные не дублируются.

def handler(event, context):
    failed_items = []
    for record in event['Records']:
        try:
            process(record['body'])
        except Exception:
            failed_items.append({"itemIdentifier": record['messageId']})
    return {"batchItemFailures": failed_items}

Мониторинг и типичные метрики

Метрика Алерт Что значит
ApproximateAgeOfOldestMessage > max TTL * 0.7 Потребитель не справляется
ApproximateNumberOfMessagesNotVisible Резкий рост Потребители взяли сообщения, но не обрабатывают
NumberOfMessagesSent vs Deleted Divergence Backlog накапливается

Процесс работы

  1. Аналитика: изучаем вашу текущую архитектуру, нагрузку, SLA. Выявляем узкие места: дублирование, потери, задержки.
  2. Проектирование: выбираем типы очередей, параметры (VisibilityTimeout, Long Polling), проектируем DLQ и Fan-out.
  3. Реализация: настройка IAM-политик, развертывание через Terraform или CloudFormation, интеграция с Lambda и EventBridge.
  4. Тестирование: нагрузочные тесты, проверка отказоустойчивости, сценарии ошибок.
  5. Деплой и мониторинг: развертывание, настройка CloudWatch алертов, дашбордов.
Основные шаги настройки SQS и SNS 1. Проверить, какой тип очереди нужен: Standard или FIFO. 2. Определить VisibilityTimeout: замерить максимальное время обработки, умножить на 1.5. 3. Создать DLQ с maxReceiveCount = 3. 4. Включить Long Polling (WaitTimeSeconds = 20). 5. Настроить IAM-роли: разрешить SNS писать в SQS, Lambda читать из SQS. 6. Протестировать сценарий ошибки — сообщение должно уйти в DLQ. 7. Настроить CloudWatch алерты на возраст сообщений и размер DLQ.

Что входит в работу

  • Аудит текущей событийной архитектуры
  • Проектирование SQS/SNS с учётом нагрузок и гарантий
  • Настройка DLQ, Long Polling, IAM-политик
  • Интеграция с Lambda, EventBridge, CloudWatch
  • Мониторинг и алерты (CloudWatch, SNS->Slack/PagerDuty)
  • Документация и обучение команды
  • Поддержка в течение 30 дней после сдачи

Сроки и стоимость

Базовая настройка SQS + SNS с Fan-out — 1–2 дня. Сложная event-driven архитектура с фильтрацией, DLQ, Lambda и мониторингом — 3–5 дней. Стоимость рассчитывается индивидуально — напишите нам для оценки. Получите консультацию и конфигурацию за 1 день.

Наши инженеры имеют многолетний опыт и сертификацию AWS Solutions Architect. SLA по инцидентам — 99.9%. Свяжитесь с нами, чтобы оценить ваш проект.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142