Что такое Amazon SQS и как отправить и получить сообщение с помощью Python?

«Что такое Amazon SQS и как отправить и получить сообщение с помощью Python?» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные концепции:

  • Стандартные очереди (Standard): Обеспечивают максимальную пропускную способность, но не гарантируют порядок доставки сообщений и могут допускать дубликаты.
  • FIFO-очереди (First-In, First-Out): Гарантируют строгий порядок доставки и однократную обработку сообщений, но имеют меньшую пропускную способность.
  • Visibility Timeout: Период времени, в течение которого сообщение, полученное обработчиком, становится невидимым для других обработчиков. Если за это время обработчик не удалит сообщение, оно снова станет доступным в очереди.
  • Dead-Letter Queue (DLQ): Очередь для сообщений, которые не удалось успешно обработать после нескольких попыток. Это позволяет анализировать и исправлять ошибки.

Пример работы с SQS на Python (библиотека boto3):

import boto3

# Инициализация клиента SQS
sqs = boto3.client('sqs', region_name='us-east-1')
queue_url = 'YOUR_QUEUE_URL' # Замените на URL вашей очереди

# 1. Отправка сообщения
response = sqs.send_message(
    QueueUrl=queue_url,
    MessageBody='Это тестовое сообщение для обработки.',
    MessageAttributes={
        'Author': {
            'DataType': 'String',
            'StringValue': 'MyApp'
        }
    }
)
print(f"Сообщение отправлено, ID: {response['MessageId']}")

# 2. Получение сообщения
response = sqs.receive_message(
    QueueUrl=queue_url,
    MaxNumberOfMessages=1, # Максимальное количество сообщений для получения
    WaitTimeSeconds=10     # Long Polling для уменьшения пустых ответов
)

if 'Messages' in response:
    message = response['Messages'][0]
    receipt_handle = message['ReceiptHandle']

    print(f"Получено сообщение: {message['Body']}")

    # 3. Удаление сообщения из очереди после обработки
    sqs.delete_message(
        QueueUrl=queue_url,
        ReceiptHandle=receipt_handle
    )
    print("Сообщение успешно обработано и удалено.")
else:
    print("В очереди нет сообщений.")