Skip to main content

Command Palette

Search for a command to run...

11'th day

CloudFront — это сеть доставки контента (CDN).

Когда на экзамене вы видите термин "CDN", подумайте о CloudFront.

CloudFront улучшает производительность чтения, кэшируя содержимое вашего веб-сайта на различных пограничных точках (edge locations).

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

CloudFront состоит из 216 точек присутствия по всему миру, которые соответствуют пограничным точкам AWS. AWS постоянно добавляет новые точки, чтобы ещё больше улучшить пользовательский опыт.

Помимо этого, благодаря тому, что ваш контент распределён по всему миру, вы получаете защиту от DDoS-атак.

DDoS-атака — это атака, при которой ваши серверы по всему миру атакуются одновременно. Мы разберём это позже в курсе.

CloudFront защищает ваше приложение от таких атак, особенно при использовании AWS Shield и Web Application Firewall (WAF), которые мы также рассмотрим в разделе о безопасности.

Теперь давайте представим, что у нас есть карта мира с отмеченными пограничными точками и кэшами.

Предположим, вы создали S3-бакет с веб-сайтом в Австралии. Если пользователь из Америки запрашивает этот контент, то запрос будет отправлен на ближайшую к нему пограничную точку в Америке через CloudFront.

CloudFront сможет получить контент из Австралии и доставить его пользователю. Если другой пользователь в Америке запросит тот же контент, он будет предоставлен напрямую из кэша на пограничной точке и не пойдёт снова в Австралию.

То же самое произойдёт, если пользователь находится, например, в Китае — его запрос отправится на ближайшую точку присутствия в Китае, а затем будет направлен к S3-бакету. После этого контент будет закэширован на точке присутствия.

Типы источников данных (Origins) в CloudFront

CloudFront поддерживает несколько типов источников данных:

  • S3-бакет — для распространения файлов и их кэширования на пограничных точках.

  • Чтобы гарантировать, что только CloudFront может получить доступ к вашему S3-бакету, вы можете использовать Origin Access Control (OAC), который заменяет устаревший Origin Access Identity (OAI).

CloudFront можно также использовать для загрузки данных в S3-бакет (это называется ингресс).

Кроме того, CloudFront может стоять перед любым HTTP-бэкендом, например:

  • Application Load Balancer

  • EC2-инстанс

  • Статический S3-вебсайт (при условии, что он настроен как статический веб-сайт)

  • Любой другой HTTP-бэкенд по вашему выбору

Как работает CloudFront?

CloudFront работает следующим образом:

  1. Пограничная точка (edge location) принимает HTTP-запрос от клиента.

  2. Если запрошенный контент уже находится в кэше этой пограничной точки, он сразу отправляется клиенту.

  3. Если контента в кэше нет, пограничная точка отправляет запрос на ваш источник данных (origin).

  4. После получения данных результат кэшируется на пограничной точке, чтобы последующие клиенты могли получить этот контент напрямую из кэша.

Пример с S3 как источником данных

Представьте, что ваш S3-бакет находится в одном регионе, например в Австралии.

Если ваш пользователь находится в Лос-Анджелесе, его запрос пойдёт на ближайшую точку присутствия в Лос-Анджелесе.

Если контента в кэше нет, точка присутствия получит данные из вашего S3-бакета через приватную сеть.

S3-бакет при этом защищён с помощью Origin Access Control (OAC) и модификации политики на бакете.

Такой же процесс произойдёт, если пользователь находится в Сан-Паулу (Бразилия) — запрос поступит на ближайшую точку присутствия в Бразилии, а контент будет получен из S3-бакета через приватное подключение.

CloudFront vs. S3 Cross-Region Replication

CloudFront и S3 Cross-Region Replication выполняют разные задачи:

  • CloudFront использует глобальную сеть точек присутствия (216 точек), кэшируя файлы на этих точках на определённое время (например, на день). Это отлично подходит для статического контента, который должен быть доступен по всему миру.

  • S3 Cross-Region Replication — это репликация данных из одного региона в другой. Он работает в режиме реального времени и не использует кэширование. Этот метод подходит для динамического контента, который часто меняется и должен быть доступен в нескольких регионах с минимальной задержкой.

CloudFront идеально подходит для распространения контента по всему миру, а S3 Replication — для синхронизации данных между несколькими регионами.

Практическое руководство по настройке CloudFront с S3-бакетом

Шаг 1: Создание S3-бакета

  1. Перейдите в консоль AWS S3.

  2. Нажмите "Create bucket" (Создать бакет).

  3. Введите имя бакета, например: demo-cloudFront-stephane-V4.

  4. Оставьте все настройки по умолчанию и нажмите "Create bucket" (Создать бакет).

Шаг 2: Загрузка файлов в S3-бакет

  1. Откройте ваш бакет.

  2. Нажмите "Upload" (Загрузить).

  3. Выберите три файла: beach.jpg, coffee.jpg и index.html.

  4. Нажмите "Upload" (Загрузить).

✅ Теперь ваши файлы загружены в бакет.


Шаг 3: Проверка доступа к файлам

  1. Перейдите в ваш бакет и выберите файл index.html.

  2. Перейдите по ссылке "Object URL" — вы увидите ошибку "Access Denied" (Доступ запрещён), так как файл не является публичным.

  3. Нажмите "Open" — откроется временная (pre-signed) ссылка, которая позволяет временно получить доступ.


Шаг 4: Настройка CloudFront

  1. Перейдите в консоль CloudFront.

  2. Нажмите "Create Distribution" (Создать дистрибуцию).

  3. В разделе "Origin Domain" выберите ваш бакет demo-cloudFront-stephane-V4.

  4. В разделе "Origin access" выберите "Origin Access Control (OAC)".

  5. Нажмите "Create control setting" и задайте имя для настройки OAC.

  6. Нажмите "Create".


Шаг 5: Настройка политики S3-бакета

  1. Перейдите в ваш S3-бакет.

  2. Перейдите в раздел "Permissions" (Разрешения).

  3. Прокрутите вниз до "Bucket Policy" (Политика бакета).

  4. Нажмите "Edit" (Редактировать).

  5. Вставьте сгенерированную политику из CloudFront.

  6. Нажмите "Save" (Сохранить).


Шаг 6: Завершение настройки CloudFront

  1. Вернитесь в консоль CloudFront.

  2. В разделе "Default Root Object" введите index.html.

  3. Нажмите "Create Distribution" (Создать дистрибуцию).

⚠️ Дистрибуция может занять несколько минут для активации.


Шаг 7: Проверка работоспособности CloudFront

  1. После успешного развертывания скопируйте доменное имя CloudFront.

  2. Вставьте его в браузер:

    • https://<your-cloudfront-domain>/index.html — должен отобразиться текст "I love coffee" и "Hello World".

    • https://<your-cloudfront-domain>/coffee.jpg — изображение кофе.

    • https://<your-cloudfront-domain>/beach.jpg — изображение пляжа.

✅ Теперь контент кешируется на CloudFront, обеспечивая быструю доставку пользователям по всему миру.


Подключение CloudFront к EC2 или Application Load Balancer (ALB)

🔹 Паттерн 1: CloudFront с EC2-инстансом

Когда CloudFront работает с EC2 в качестве HTTP-бэкенда, необходимо учесть несколько ключевых моментов:

EC2 должен быть публичным — поскольку CloudFront не поддерживает частное подключение по VPC.

Security Group на EC2 должен разрешать входящие запросы от всех IP-адресов CloudFront Edge Locations.

📌 Где найти список IP-адресов CloudFront?
AWS публикует их здесь.

Шаги:

  1. Создайте EC2-инстанс с установленным HTTP-бэкендом.

  2. Откройте Security Groups и настройте:

    • Inbound Rule (Входящее правило) ➔ Разрешите HTTP (порт 80) или HTTPS (порт 443) с источником, равным списку IP-адресов CloudFront.
  3. Создайте CloudFront Distribution, выбрав ваш EC2-инстанс как Origin.

  4. CloudFront теперь может кэшировать и доставлять контент от вашего EC2-инстанса.


🔹 Паттерн 2: CloudFront с Application Load Balancer (ALB)

Когда вы используете ALB, структура становится более безопасной и удобной:

ALB должен быть публичным — это необходимо для подключения CloudFront.

EC2-инстансы могут быть приватными — ALB сможет подключиться к ним по частному VPC-соединению.

Security Group на EC2 должен разрешать входящие соединения только от Security Group вашего ALB.

Шаги:

  1. Создайте EC2-инстансы в приватных подсетях.

  2. Настройте Application Load Balancer:

    • Убедитесь, что ALB находится в публичной подсети.
  3. Настройте Security Group:

    • Для EC2: Разрешите входящие соединения только от Security Group вашего ALB.

    • Для ALB: Разрешите входящие соединения от CloudFront IP-адресов (HTTP или HTTPS).

  4. Создайте CloudFront Distribution, выбрав ALB как Origin.


🔹 Итог

  • EC2 напрямую — должен быть публичным и иметь Security Group, разрешающую CloudFront IP.

  • EC2 через ALB — ALB должен быть публичным, а EC2 может быть приватным с ограниченным доступом.

🔹 CloudFront Geo Restriction (Географические ограничения в CloudFront)

CloudFront позволяет ограничить доступ к вашей дистрибуции на основе страны, из которой поступает запрос. Это полезно, например, для соблюдения авторских прав или региональных ограничений.

🔸 Варианты ограничений

Allowlist (Список разрешённых стран) — Доступ разрешён только странам из списка.
Blocklist (Список запрещённых стран) — Доступ запрещён странам из списка.

🔸 Как работает определение страны?

  • CloudFront использует стороннюю базу данных Geo-IP, чтобы сопоставить IP-адрес пользователя с его страной.

🔸 Пример настройки Geo Restriction

  1. Перейдите в консоль CloudFront.

  2. Выберите вашу дистрибуцию.

  3. Перейдите в раздел Security (Безопасность).

  4. Перейдите в Geographic Restrictions (Географические ограничения).

  5. Нажмите Edit (Редактировать).

  6. Выберите:

    • Allowlist — укажите страны, которым разрешён доступ.

    • Blocklist — укажите страны, которым запрещён доступ.

  7. Нажмите Save Changes (Сохранить изменения).

✅ Теперь CloudFront будет фильтровать запросы на основе вашей настройки.

🔹 CloudFront Pricing and Price Classes (Цены и классы цен CloudFront)

CloudFront имеет разные цены в зависимости от региона, из которого происходит передача данных. Поскольку некоторые регионы дороже, AWS предлагает Price Classes (Классы цен), которые позволяют оптимизировать затраты.


🔸 Понимание цен

  • США, Канада, Мексика — $0.085 за ГБ (первые 10 ТБ).

  • Индия — примерно в 2 раза дороже ($0.17 за ГБ).

  • Большие объёмы данных (более 5 ПБ) — стоимость снижается до $0.02 за ГБ (в США).


🔸 Классы цен (Price Classes)

CloudFront предлагает три уровня охвата по регионам:

Price Class All

  • Включает все регионы.

  • Обеспечивает лучшую производительность, но по более высокой цене.

Price Class 200

  • Включает большинство регионов, но исключает самые дорогие (например, Индия, Южная Америка).

  • Компромисс между производительностью и стоимостью.

Price Class 100

  • Включает только самые дешёвые регионы (например, США, Канада, Европа).

  • Самый экономичный вариант, но с потенциально худшей производительностью в удалённых регионах.


🔸 Выбор оптимального класса цен

  • Выберите Price Class All для приложений, требующих максимальной производительности по всему миру.

  • Выберите Price Class 200 для экономии на дорогостоящих регионах, сохраняя высокую доступность.

  • Выберите Price Class 100 для минимальных затрат, если пользователи сосредоточены в Северной Америке и Европе.


🔸 Настройка Price Classes

  1. Перейдите в консоль CloudFront.

  2. Выберите вашу дистрибуцию.

  3. Перейдите в раздел Settings (Настройки).

  4. Найдите параметр Price Class.

  5. Выберите один из вариантов:

    • Price Class All

    • Price Class 200

    • Price Class 100

  6. Нажмите Save Changes (Сохранить изменения).

✅ Теперь ваша дистрибуция будет использовать выбранный класс цен.

🔹 AWS Global Accelerator — Полный разбор

AWS Global Accelerator — это сервис, который улучшает производительность и доступность ваших глобальных приложений, минимизируя задержки (latency) и обеспечивая стабильный доступ.


🔸 Проблема, которую решает Global Accelerator

❗ Проблема: Если ваше приложение размещено в одном регионе, но обслуживает пользователей по всему миру, трафик идёт по публичному интернету, вызывая:

  • Увеличение задержек (latency)

  • Риск потери соединения

  • Нестабильную производительность

Решение: AWS Global Accelerator использует Anycast IP для быстрого направления трафика через ближайшую точку присутствия (Edge Location) по внутренней сети AWS, снижая задержку и улучшая стабильность.


🔸 Unicast IP vs Anycast IP

Тип IPОписание
Unicast IPОдин сервер имеет один уникальный IP-адрес.
Anycast IPНесколько серверов имеют один и тот же IP-адрес, а пользовательский запрос направляется к ближайшему серверу по географическому расположению.

Global Accelerator использует Anycast IP, чтобы подключаться к ближайшей точке присутствия.


🔸 Как работает AWS Global Accelerator?

  1. Пользователь отправляет запрос.

  2. Запрос поступает на ближайшую точку присутствия (Edge Location).

  3. Запрос направляется по внутренней сети AWS к ALB, NLB или EC2-инстансу.

  4. Трафик не проходит по ненадёжному публичному интернету, что значительно снижает задержку.


🔸 Что поддерживает AWS Global Accelerator?

Elastic IP
EC2-инстансы
Application Load Balancer (ALB)
Network Load Balancer (NLB)
✅ Может работать как с публичными, так и с приватными ресурсами.


🔸 Преимущества AWS Global Accelerator

Низкая задержка (low latency) — трафик направляется по внутренней сети AWS.
Автоматическое переключение на резервный сервер — при сбое запросы перенаправляются на работающий инстанс менее чем за минуту.
DDoS-защита — обеспечивается с помощью AWS Shield.
Две статические IP-адреса — упрощает настройку DNS и исключает изменения IP при замене ресурсов.


🔸 Отличия AWS Global Accelerator vs CloudFront

ФункцияCloudFrontGlobal Accelerator
Тип трафикаHTTP(S) — для ускорения доставки статического и динамического контента.TCP/UDP — для ускорения сетевых приложений.
КэшированиеДа — для статического контента (изображения, видео, HTML и т.п.).❌ Нет — всегда направляет запросы к бэкенду.
ИспользованиеПодходит для веб-приложений и API.Подходит для VoIP, игр, IoT и приложений с требованием статического IP.
Функция аварийного переключения (failover)Автоматическое переключение между edge locations.Автоматическое переключение между регионами менее чем за 1 минуту.

🔸 Когда использовать AWS Global Accelerator?

✅ Для приложений с глобальными пользователями.
✅ Когда вам нужен статический IP для упрощения управления DNS.
✅ Для приложений с низкой задержкой и высокими требованиями к производительности.
✅ Для приложений, использующих UDP или TCP, таких как игры, VoIP или IoT.
✅ Для обеспечения быстрого автоматического переключения при сбое в регионе.


🔹 Итог

  • CloudFront = Отлично для кешируемого контента (статические ресурсы, видео и т.п.).

  • Global Accelerator = Идеально для приложений с низкой задержкой и статическим IP.

🔹 AWS Integration & Messaging — Обзор

Когда вы начинаете разворачивать несколько приложений в AWS, возникает необходимость организовать их взаимодействие. Для этого существует два основных паттерна коммуникации:


🔸 1. Синхронная (Synchronous) коммуникация

✅ Прямое подключение между сервисами.
✅ Один сервис отправляет запрос и ждёт немедленного ответа от другого сервиса.

Пример:
🛒 Сервис покупок ➔ 🚚 Сервис доставки

  • При покупке товара сервис покупок немедленно отправляет запрос сервису доставки.

❗ Проблема: Если сервис доставки перегружен или не отвечает, сервис покупок также зависнет или выйдет из строя.


🔸 2. Асинхронная (Asynchronous) коммуникация

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

Пример:
🛒 Сервис покупок ➔ 📥 Очередь ➔ 🚚 Сервис доставки

  • Сервис покупок просто отправляет данные в очередь и сразу продолжает свою работу.

  • Сервис доставки обрабатывает элементы из очереди, когда готов к этому.

✅ Такой подход обеспечивает стабильность при скачках трафика или непредсказуемой нагрузке.


🔹 Решения AWS для асинхронной коммуникации

AWS предлагает три основных сервиса для реализации асинхронного обмена данными:

  1. SQS (Simple Queue Service) — Очередь сообщений (queue model).
    ➔ Подходит для отправки и обработки независимых сообщений.

  2. SNS (Simple Notification Service) — Модель публикации/подписки (pub/sub model).
    ➔ Подходит для массового оповещения множества подписчиков.

  3. Kinesis — Потоковая обработка данных (real-time streaming).
    ➔ Подходит для обработки больших объёмов данных в реальном времени.


🔸 Как выбрать подходящий сервис?

SQS → Если нужно гарантировать доставку каждого отдельного сообщения.
SNS → Если требуется уведомить множество подписчиков одновременно.
Kinesis → Если обрабатываете большие объёмы данных в реальном времени (например, видеопоток или аналитика).


🔹 Итог

  • Синхронная связь = Простота, но риски при высокой нагрузке.

  • Асинхронная связь = Гибкость, масштабируемость и защита от перегрузок.

🔹 Amazon SQS (Simple Queue Service) — Обзор и ключевые концепции

Amazon SQS — это полностью управляемая служба очередей сообщений, предназначенная для разделения (decoupling) компонентов приложений и обработки большого количества сообщений.


🔸 Основные компоненты SQS

  1. Queue (Очередь) — содержит сообщения, ожидающие обработки.

  2. Producer (Производитель) — сервис или приложение, отправляющее сообщения в очередь.

  3. Consumer (Потребитель) — сервис или приложение, извлекающее сообщения из очереди для их обработки.


🔸 Как работает SQS?

Производители отправляют сообщения в очередь с помощью SendMessage API.
✅ Сообщения хранятся в очереди до тех пор, пока потребитель их не извлечёт и не удалит.
✅ Потребители используют Poll API для запроса сообщений из очереди.
✅ После успешной обработки потребитель должен вызвать DeleteMessage API, чтобы удалить сообщение.


🔸 Важные характеристики SQS

Неограниченная пропускная способность — можно отправлять неограниченное количество сообщений.
Неограниченное количество сообщений в очереди — очередь может хранить сколько угодно данных.
Жизненный цикл сообщений (Message Retention Period) — по умолчанию 4 дня, максимум 14 дней.
Низкая задержка (Low latency) — менее 10 мс на публикацию и получение сообщений.
Максимальный размер сообщения — 256 КБ.
Доставка сообщенийAt Least Once Delivery (сообщение может быть доставлено более одного раза).
Порядок доставкиBest-Effort Ordering (порядок может нарушиться).


🔸 Типы очередей SQS

  1. Standard Queue (Стандартная очередь)
    ✅ Неограниченная пропускная способность.
    ✅ Сообщения могут быть доставлены более одного раза.
    ✅ Порядок сообщений может нарушаться.

  2. FIFO Queue (First-In-First-Out очередь)
    ✅ Сохраняет порядок сообщений.
    ✅ Сообщения доставляются ровно один раз (Exactly-Once Delivery).
    ✅ Подходит для критичных задач, где порядок данных важен.


🔸 Пример сценария

🛒 Производитель: Сервис покупок отправляет сообщение о новом заказе в SQS.
🚚 Потребитель: Сервис доставки извлекает это сообщение, обрабатывает заказ и затем удаляет сообщение.


🔸 Автоматическое масштабирование

✅ SQS может интегрироваться с Auto Scaling Groups на основе метрики ApproximateNumberOfMessages (длина очереди).
✅ При увеличении очереди CloudWatch Alarm может масштабировать количество EC2-инстансов для обработки очереди.


🔸 Пример архитектуры SQS в реальной жизни

🎥 Приложение по обработке видео:

  • Frontend: Принимает запрос на обработку видео и отправляет сообщение в SQS.

  • Backend: Потребитель обрабатывает видео и загружает результат в S3.
    ✅ Такое разделение позволяет фронтенду обрабатывать больше запросов без перегрузки.


🔸 Безопасность в SQS

Шифрование данных при передаче — через HTTPS.
Шифрование данных в состоянии покоя (At Rest Encryption) — с использованием KMS-ключей.
Политики доступа — для управления разрешениями с помощью IAM policies и SQS Access Policies (например, для межаккаунтного доступа или отправки уведомлений из SNS/S3).


🔹 Итог

SQS идеально подходит для асинхронной коммуникации между сервисами.
✅ Устойчив к скачкам трафика.
✅ Обеспечивает надёжную доставку сообщений с возможностью автоматического масштабирования.

🔹 Практическое руководство по созданию и работе с Amazon SQS

🔸 Шаг 1: Создание очереди (Queue)

  1. Перейдите в консоль Amazon SQS.

  2. Нажмите "Create queue" (Создать очередь).

  3. Выберите тип очереди:

    • Standard Queue — выберите этот вариант.
  4. Введите название очереди: Demo Queue.

  5. Оставьте настройки по умолчанию:

    • Visibility Timeout — 30 секунд (время скрытия сообщения после получения).

    • Delivery Delay — 0 секунд (без задержки доставки).

    • Retention Period — 4 дня (по умолчанию).

    • Max Message Size — 256 КБ (максимальный размер сообщения).

  6. В разделе Encryption выберите SSE-SQS для автоматического шифрования.

  7. В разделе Access Policy выберите:

    • Только владелец очереди может отправлять и получать сообщения.
  8. Нажмите "Create Queue" (Создать очередь).

✅ Очередь успешно создана.


🔸 Шаг 2: Отправка сообщений в очередь (Producer)

  1. Выберите созданную очередь Demo Queue.

  2. В правом верхнем углу нажмите "Send and receive messages".

  3. В поле Message body введите текст:

     Hello World!
    
  4. Нажмите "Send message".

✅ Сообщение успешно отправлено.


🔸 Шаг 3: Получение сообщений из очереди (Consumer)

  1. В том же окне, в разделе Receive messages, нажмите "Poll for messages".

  2. Появится сообщение с подробной информацией:

    • Message ID — Уникальный идентификатор.

    • Message Body — Текст сообщения (например, Hello World!).

    • Receive Count — Количество раз, когда сообщение было получено (например, 1).

  3. Для успешной обработки сообщения:

    • Выберите сообщение.

    • Нажмите "Delete".

✅ Сообщение успешно удалено.


🔸 Шаг 4: Повторное получение сообщения

Если вы не удалите сообщение после обработки, оно снова появится в очереди после истечения Visibility Timeout (по умолчанию 30 секунд).

Пример:

  • При первом получении сообщение будет иметь Receive Count = 1.

  • Через 30 секунд оно появится снова, и его Receive Count станет 2.


🔸 Шаг 5: Отправка нескольких сообщений

  1. Повторите отправку нескольких сообщений:

    • "Hello World!"

    • "Hello World 2"

    • "Hello World 3"

  2. В окне очереди вы увидите, что в разделе Available messages будет указано 3.

  3. Нажмите "Poll for messages", чтобы получить их все.

  4. Выберите все сообщения и нажмите "Delete", чтобы удалить их из очереди.

✅ Все сообщения успешно обработаны и удалены.


🔸 Шаг 6: Удаление всех сообщений (Purge Queue)

Если вам нужно быстро очистить очередь (например, в среде разработки):

  1. Перейдите на страницу очереди.

  2. Нажмите "Purge Queue".

  3. Введите слово purge и подтвердите действие.

✅ Очередь очищена.


🔸 Шаг 7: Мониторинг и безопасность

  • В разделе Monitoring можно отслеживать:

    • Количество сообщений в очереди.

    • Возраст самого старого сообщения.

  • В разделе Encryption отображается используемая система шифрования (например, SSE-SQS).

  • В разделе Access Policy можно настроить IAM-права и межаккаунтный доступ.


🔹 Итог

  • Вы создали очередь SQS, отправили сообщения, получили их, и успешно удалили.

  • Вы увидели, как работает система повторной доставки при неполучении сообщения.

  • Вы изучили механизм очистки очереди и базовые настройки безопасности.

🔹 Message Visibility Timeout в Amazon SQS

Message Visibility Timeout — это ключевая концепция в Amazon SQS, которая определяет, как долго сообщение остаётся невидимым для других потребителей после его получения.


🔸 Как работает Visibility Timeout?

  1. Производитель отправляет сообщение в очередь.

  2. Потребитель извлекает сообщение с помощью ReceiveMessage API.

  3. Сообщение становится невидимым для других потребителей на время Visibility Timeout (по умолчанию 30 секунд).

  4. Если потребитель:

    • Успешно обработал сообщение ➔ Потребитель вызывает DeleteMessage API, и сообщение удаляется из очереди.

    • Не успел обработать сообщение ➔ По истечении Visibility Timeout сообщение снова становится видимым и может быть повторно получено другим потребителем.


🔸 Пример сценария

  1. Сообщение поступает в очередь.

  2. Потребитель A извлекает сообщение и начинает его обрабатывать (Visibility Timeout = 30 секунд).

  3. Потребитель B пытается получить сообщение, но не видит его, так как оно всё ещё находится в окне видимости.

  4. Если потребитель A не успел завершить обработку за 30 секунд, сообщение снова становится видимым и может быть получено потребителем B.

✅ Это может привести к дублирующейся обработке, поэтому важно правильно настраивать время тайм-аута.


🔸 Что делать, если потребителю нужно больше времени?

Если потребитель знает, что обработка сообщения займет больше времени, он может вызвать:

ChangeMessageVisibility API

✅ Этот вызов продлевает Visibility Timeout, давая потребителю дополнительное время для завершения обработки.


🔸 Оптимальная настройка Visibility Timeout

  • Слишком долгое значение (например, 12 часов) → Если потребитель упадёт, сообщение останется "заблокированным" на долгое время.

  • Слишком короткое значение (например, 5 секунд) → Потребитель может не успеть завершить обработку, и сообщение будет дублироваться.

✅ Рекомендуется устанавливать разумное значение (например, 30 секунд) и использовать ChangeMessageVisibility API при необходимости.


🔸 Практическая демонстрация в консоли AWS

  1. Перейдите в консоль Amazon SQS.

  2. Выберите вашу очередь и нажмите "Send and receive messages".

  3. Откройте два окна браузера (чтобы эмулировать двух потребителей).

  4. В первом окне:

    • Отправьте сообщение "Hello World!".

    • Нажмите "Poll for messages" и получите сообщение.

  5. Во втором окне:

    • Нажмите "Poll for messages" ➔ Сообщение не будет видно (оно находится в окне Visibility Timeout).
  6. После 30 секунд:

    • Нажмите снова "Poll for messages" во втором окне ➔ Сообщение станет доступным, так как предыдущий потребитель не удалил его.
  7. Убедитесь, что Receive Count увеличился (например, со значением 2).


🔸 Как изменить Visibility Timeout?

  1. Перейдите в консоль Amazon SQS.

  2. Выберите вашу очередь и нажмите "Edit".

  3. Измените значение Visibility Timeout (значение можно установить от 0 до 12 часов).

  4. Нажмите "Save".


🔹 Итог

Visibility Timeout защищает ваши сообщения от двойной обработки во время обработки.
✅ Используйте ChangeMessageVisibility API, чтобы продлить окно видимости при необходимости.
✅ Выбирайте тайм-аут, соответствующий времени обработки вашего потребителя.

Если хотите увидеть пример кода или дальнейшие пояснения, дайте знать! 🚀