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.