Kolejkowanie wiadomości z wykorzystaniem AWS SQS oraz Python

Posiadasz aplikację w której potrzebujesz sobie zakolejkować pewne zadania? W tym artykule napiszemy prosty skrypt do wysyłania i odbierania wiadomości z wykorzystaniem Python, boto3 oraz AWS SQS, czyli serwis do kolejkowania.

Standardowo potrzebujemy mieć skonfigurowane AWS CLI oraz Python, ponieważ zdecydowanie wygodniej się pracuje przy pomocy CLI, niż klikać w konsoli 😉

Tworzenie kolejki SQS

Przy samym AWS CLI za dużo nie będziemy pracować, bo wykorzystamy je do utworzenia kolejki. W pierwszej kolejności musimy utworzyć plik z atrybutami dla naszej kolejki. Utwórzmy więc plik queue-attributes.json z poniższym kodem

{
  "MessageRetentionPeriod": "180"
}

Powyższy atrybut oznacza czas, po jakim wiadomość zostanie automatycznie usunięta z naszej kolejki, jeżeli nie zostanie pobrana z niej, więcej atrybutów opiszę na samym dole. Ok, mamy utworzony plik z atrybutami, więc teraz musimy uruchomić polecenie, które wykorzysta go, do utworzenia kolejki:

aws sqs create-queue --queue-name devops-queue --attributes file://queue-attributes.json

W odpowiedzi powinniśmy dostać QueueUrl do naszej kolejki jak poniżej

{
    "QueueUrl": "https://sqs.eu-central-1.amazonaws.com/111111111111/devops-queue"
}

Takim oto sposobem, utworzyliśmy kolejkę w AWS SQS, zapiszmy sobie QueueUrl, ponieważ zaraz nam się przyda 🙂

Wysyłanie wiadomości do kolejki

Utwórzmy sobie plik send.py i wklejmy do niego poniższy kod

import boto3

# Create SQS client
sqs = boto3.client('sqs')

queue_url = 'https://sqs.eu-central-1.amazonaws.com/111111111111/devops-queue'

# Send message to SQS queue
response = sqs.send_message(
    QueueUrl=queue_url,
    DelaySeconds=10,
    MessageAttributes={
        'Name': {
            'DataType': 'String',
            'StringValue': 'John'
        },
        'Surname': {
            'DataType': 'String',
            'StringValue': 'Example'
        }
    },
    MessageBody=(
        'This is only example message'
    )
)

print(response['MessageId'])

W powyższym skrypcie w queue_url należy wkleić adres, który otrzymaliśmy po utworzeniu kolejki. Skrypt wysyła wiadomość do kolejki, która zawiera atrybuty name, surname oraz MessageBody z główną wiadomości. Po odpaleniu skryptu, jako wynik powinien zostać zwrócony MessageID, na podstawie którego można zidentyfikować wiadomość.

Pobieranie wiadomości z kolejki

Utwórzmy sobie plik receive.py i wklejmy do niego poniższy kod

import boto3

# Create SQS client
sqs = boto3.client('sqs')

queue_url = 'https://sqs.eu-central-1.amazonaws.com/111111111111/devops-queue'

# Receive message from SQS queue
response = sqs.receive_message(
    QueueUrl=queue_url,
    AttributeNames=[
        'SentTimestamp'
    ],
    MaxNumberOfMessages=1,
    MessageAttributeNames=[
        'All'
    ],
    VisibilityTimeout=0,
    WaitTimeSeconds=0
)

message = response['Messages'][0]
receipt_handle = message['ReceiptHandle']

# Delete received message from queue
sqs.delete_message(
    QueueUrl=queue_url,
    ReceiptHandle=receipt_handle
)
print('Received and deleted message: %s' % message)

Powyższy skrypt pobiera tylko jedną wiadomość z kolejki, zgodnie z parametrem MaxNumerOfMessages, który oznacza ilość wiadomości do pobrania za jednym razem. Następnie zwraca nam tą wiadomość na ekran i usuwa ją z kolejki, aby np kolejna instancja skryptu, nie pobrała ponownie tej wiadomości.

Takim oto sposobem, napisaliśmy skrypt w Python do odbierania oraz wysyłania wiadomości do AWS SQS. Prawda, że proste? 🙂

Atrybuty AWS SQS

Message retention period – Oznacza czas, przez jaki nasza wiadomość będzie widzialna w kolejce, zanim zostanie usunięta
Delivery delay – Jest to czas o jaki AWS SQS opóźni dostarczenie wiadomości dodanej do kolejki
Maximum message size – Określa maksymalny rozmiar wiadomości. Minimalny rozmiar to 1 bajt, maksymalny 256kb, można to zwiększyć nawet do 1GB, ale trzeba wykorzystać Amazon SQS Extended Client Library for Java
Receive message wait time – Maksymalny czas przez jaki SQS czeka, aż wiadomości staną się dostępne, po tym jak kolejka otrzymania żądanie pobrania jej

Amazon SQS dead-letter queues

Jest to specjalna kolejka, do której trafiają wiadomości z kolejek SQS, które z jakiegoś powodu nie mogą być przetworzone. Po więcej informacji odsyłam do dokumentacji AWS https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html

Mam nadzieję, że powyższy artykuł przekona Was do korzystania z AWS SQS, oraz ułatwi start z wykorzystaniem w swoich projektach.

Related Posts