Merhaba arkadaşlar, Mobilhanem üzerinden yayınladığımız AWS Derslerimize bu dersimizde Amazon SQS ile devam ediyoruz. Amazon SQS (Simple Queue Service), servisler arası mesajlaşmanın asenkron bir şekilde, birbirini bloklamadan işlemlerine devam etmesinde kullanılan, yüksek ölçeklenebilirlik ve güvenilirliğe sahip kuyruk sistemidir. Bulut sistemlerde kuyruk yapısı kullanarak servislerimizin daha rahat ölçeklenmesine, anlık artışlarda mesajları kuyrukta biriktirip cevaplanmasına ve servislerin birbirini bloklamadan işlemlerine devam etmesine olanak sağlamaktadır.
SQS servisinde iki çeşit kuyruk yapısı bulunmaktadır. Bunlar standart ve FIFO kuyruklarıdır.
Standart Kuyruk
Kuyruğa gönderilen mesajların sırasının, kuyruğa giriş sırasında iletilmesinin garanti edilemediği kuyruklardır. Kuyruktaki mesajların en az bir kere iletimini sağlar ve aynı mesajı tekrar iletebilmektedir.
Bu kuyruk yapısına örnek olarak bir E-Ticaret sistemindeki sepet yapısını düşünebiliriz. Kullanıcının iki farklı ürünü sepete at tuşuna bastığında sırayla atılmasının önemi olmadığı ancak hızlı bir aktarım sağladığı için standart kuyruk yapısını kullanabiliriz.
FIFO Kuyruk (First In First Out)
Kuyruğa gönderilen mesajların, gönderilme sırasına göre iletimini sağlamaktadır. FIFO ilk giren ilk çıkar mantığıyla çalışmaktadır ve mesajların yalnızca bir defa iletilmesini sağlamaktadır. İstemci mesajı işleyip kuyruktan silene kadar mesaj kuyrukta durmaya devam eder ancak başka bir istemci bu mesajı çekemez.
Bu kuyruk yapısına örnek olarak bir E-Ticaret sisteminde artarda 2 defa fiyat değişikliği isteğinin gönderildiğini düşünelim. Eğer bizim gönderdiğimiz sırayla fiyat güncellenmezse çeşitli sıkınıtılar yaşanabilir. Bu tip yapılarda FIFO kuyruk tercih edilmektedir.
Yazımızın devamında Amazon SQS servisini nasıl oluşturacağımızı ve nasıl kullanacağımızdan bahsedeceğiz.
Amazon SQS oluştururken çeşitli özelliklerini konfigüre edilebilmesine olanak sağlamaktadır.
Default Visibility Timeout: Kuyruktan alınan mesajın kaç saniye sonra diğer istemciler tarafından görülmesinin ayarlanmasını sağlar. Bu süre boyunca mesajı istemciler göremez.
Message Retention Period: Mesajın silinmediği sürece ne kadar süre boyunca saklanacağını belirtilmesini sağlar.
Maximum Message Size: Kuyruğa aktarılan mesajın maksimum boyutunun ayarlanmasını sağlar. Amazonun çeşitli kütüphaneleri ile bu boyut S3 referansı verilerek 2GB’a kadar arttırılabilir.
Delivery Delay: Kuyruğa gelen bir mesajın ilk aktarımının yapılması için beklenecek süre.
Dead-Letter Queue (DLQ) : Herhangi bir sebepten ötürü iletimi sağlanamayan mesajların kaybolmasını önlemek ve mesajın içeriğinin ne olduğunu görerek servisimizin mesajı neden işleyemediğinin anlaşılması sağlanabilir.
SSE(Server Side Encryption) ile gönderilen mesajların alınmasına kadar geçen sürede şifrelenerek saklanması sağlabilir.
SNS – SQS Subscription
SNS aboneliklerinden bir tanesinin de SQS servisi olduğunu belirtmiştik. Bu sayede mesajları kuyruğa direk olarak göndermek yerine iletimde çıkabilecek çeşitli sıkıntılara karşı SNS kullanarak iletimin güvenilirliğini arttırabiliriz.
Polling
Amazon SQS short polling ve long polling olarak iki farklı polling yapısı sunmaktadır.
Short polling için mesaj isteğini belirli sunuculara iletir ve mesajı bulamadığı takdirde dahi hemen cevabı dönmektedir.
Long polling ise mesaj isteğini tüm SQS sunuclarına iletir ve belirlenen maksimum mesaj sayısına ulaştığında ya da polling süresi dolduğunda cevabı döner.
Polling hakkında daha detaylı bilgi almak için AWS dokümanlarına bakabilirsiniz.
Örnek
Bir adet standart kuyruk oluşturalım. Queue Name parametresiyle kuyruğun ismini geçiyoruz.
$ aws sqs create-queue --queue-name TestQueue { "QueueUrl": "https://eu-central-1.queue.amazonaws.com/123456789012/TestQueue" }
Bu kuyruğa bir mesaj gönderelim. Bunun için kuyruğun adresi ve mesajımızın içeriğini parametre olarak vermemiz gerekiyor.
$ aws sqs send-message --queue-url https://eu-central-1.queue.amazonaws.com/123456789012/TestQueue --message-body "Ilk mesaj" { "MD5OfMessageBody": "2fb4a55c97a1ff1fb3655a3d3fa023df", "MessageId": "t1201k91-kz28-1k09-aa123-d18to8a98181" }
Bu mesajı almak için alttaki komutu girelim. Dönen cevaptaki mesajın hash değeri ve id’si gönderdiğimiz mesaj ile aynı olduğuna görebilmekteyiz.
$ aws sqs receive-message --queue-url https://eu-central-1.queue.amazonaws.com/123456789012/TestQueue { "Messages": [ { "Body": "Ilk mesaj", "ReceiptHandle": "...”, "MD5OfBody": "2fb4a55c97a1ff1fb3655a3d3fa023df", "MessageId": "t1201k91-kz28-1k09-aa123-d18to8a98181" } ] }
Bu aşamada mesajı silmediğimiz için kuyrukta durmaya devam etmektedir. Bir mesajı silmek için mesajın içeriğinde bulunan ReceiptHandle alanını göndererek hangi mesaj olduğunu belirterek silme isteği gönderiyoruz.
$ aws sqs delete-message --queue-url https://eu-central-1.queue.amazonaws.com/123456789012/TestQueue --receipt-handle ...
Bu yazımızda Amazon SQS servislerinden ve kuyruk yapılarından bahsettik. SQS yüksek ölçeklendirilmesiyle, kuyruk yapısındaki elemanların aktarım konfigürasyonları gibi özellikleri ile sistemlerinizi ölçeklemeye ve asenkron iletişimi güvenli bir şekilde yapmanıza yardımcı olabilir.
AWS servisleri için diğer derslerimize buradan ulaşabilirsiniz.
7