Azure WebJobs ile Queue'ların Kullanımı

0 dakikada yazıldı

54467 defa okundu

Düzenle

Hatırlarsanız bundan bir süre önce Azure WebJobs konusundan bahsetmiş, hatta ilk girişi yapmanın yanı sıra Blob'lara WebJobs SDK kullanımına da göz atmıştık. Bu yazıda ise aynı konuya davem ederken Azure WebJobs ile beraber Azure Storage'daki Queue yapılarını, yani kuyrukları nasıl kullanabileceğimize göz atacağız. Queue Storage servisine hiç göz atmamış olanlarla ilk başta Queue Servisi yazısını sonra da Role'ler arası iletişimde nasıl kullanıldığına dair yazıyı okumanızı tavsiye ederim. Böylece Azure Storage Queue yapısının hangi problemleri çözmeye çalıştığını ve nasıl bir şey olduğunu hızlıca öğrenebilirsiniz.

WebJobs'ın kuyruklarla çalışma şekli bloblarla çalışma şekli ile az çok aynı. Kuyruktaki Message'ları teker teker WebJob'ınızı çalıştırılmasına neden olurken kuryuktaki mesaj doğrudan WebJob tanımındaki fonsiyonunuza parametre olarak geçiyor.

[C#]

public static void KuyruktanGelen([QueueInput("kuyrugum")] string parametre)
{

}

Metodun parametresini isterseniz yukarıdaki gibi dekore ederek QueueInput'a kullanmak istediğiniz kuyruğun adını verebiliyorsunuz. Parametre tipi eğer string olarak bırakılırsa aslında arka planda kullanılan CloudQueueMessage üzerinden AsString ile alınan sonuç size iletiliyor. Alternatif olarak "object" tipinde tanımlarsanız paramtreyi bu sefer de AsBytes ile Byte Array döndürülecektir.

 Kuyruklarla çalışanlarınız hatırlayacaktır, kuyruktaki mesajların alınma süreleri, expire süreleri var. Eğer belirli bir zamanda kuyruktan alınan mesajı işleyemezseniz UpdateMessage ile expire süresini uzatmak zorundasınız. Tüm bu işlemler WebJobs SDK tarafından otomatik olarak gerçekleştiriliyor. Yani yukarıdaki metod ne kadar uzun sürerse sürsün arka planda WebJobsSDK sürekli UpdateMessage ile kuyruktan aldığınız mesajın expire süresini öteleyecektir. Aslına WebJobs SDK'in yaptıkları bu kadarla da kalmıyor. Eğer metod içerisinde herhangi bir noktada Exception throw ederseniz doğrudan mesaj kuyruğa geri bırakılıyor. Özetle yapılmaya çalışılan aslında olabildiğince sizi doğrudan gerçekeştirmeniz gerekecek kuyruk operasyonlarından uzaklaştırmak ve böylece işinizi kolaylaştırmak.

POCO desteği de var!

Çoğumuz kuyruklara mesaj atarken Serialized bir obje atıyoruz. Basit stringler atmıyoruz. Bu durumun farkında olan SDK ekibi ciddi güzel bir hareket yapmış ve Serialize-Deserialize olaylarını da transparan hale getirmeye çalışmış. Bence çok da iyi iş çıkarmışlar.

[C#]

public class OrnekKuyrukMesaji
{
    public string Icerik1 { get; set; }
    public string Icerik2 { get; set; }
}
public static void KuyruktanGelen([QueueInput("queuename")] OrnekKuyrukMesaji parametre)
{

}

Bence bu çok şık bir hareket. Atla deve değil. Sonuç itibari ile gelen String biz de DeSerialize edebilirdik ama böyle ufak şeyler hem kodu daha temiz tutarken hem de sonuç itibari ile günlük işleri kolaylaştırıyor.

Kuyruğa geri mesaj atmak istersek?

Diyelim ki kuyruktan mesajı aldınız, işlediniz ve başka bir kuyruğa atacaksınız veya Blobları da kullanıyorsunuz ve bloblardan gelen bir trigger sonrasında bir kuyruğa mesaj atmak istediniz. Özetle, şu ana kadar kuyruklardan nasıl mesaj alırız kısmına baktık. Şimdi ise nasıl mesaj atabileceğimize göz atacağız.

[C#]

public class OrnekKuyrukMesaji
{
    public string Icerik1 { get; set; }
    public string Icerik2 { get; set; }
}

public class GidenMesaj
{
    public string Icerik1 { get; set; }
    public string Icerik2 { get; set; }
}
public static void KuyruktanGelenKuyrugaGider(
    [QueueInput("gelenkuyruk")] OrnekKuyrukMesaji parametre,
    [QueueOutput("gidenkuyruk")] out GidenMesaj gidenParametre,
    [QueueOutput("log")] out string log)
{
    gidenParametre = new GidenMesaj();
    gidenParametre.Icerik2 = parametre.Icerik1;
    gidenParametre.Icerik1 = parametre.Icerik1;
    log = gidenParametre.Icerik1;
}

Yukarıdaki örnekteki iki farklı POCO'yu bir kenara koyalım. En son metoda baktığınızda bir değil tam üç tane kuyrukla alakamız olduğunu göreceksiniz. Bu kuyruklardan ilki "gelenkuyruk" içinden mesaj alacağımız yer olacak. Oradan gelen mesajları "OrnekKuyrukMesaji" nesnesine DeSerialize ediyoruz. Sonra output parametre olarak iki farklı parametremiz var ve ikisi de aslında farklı kuyruklara gidiyor. Birine Seralize olacak bir obje olarak GidenMesaj nesnesini gönderirken diğerine string gönderiyoruz. Bu metod WebJobs tarafından çalıştırıldığında bir kuyruktan alından mesajı transform edip iki ayrı kuyruğa mesaj göndermiş olacağız. Yazdığımız kodun normak Azure SDK'deki Queue operasyonlarına göre inanılmaz derece kısalmış olduğunu söylemem gerek. İtiraf etmek gerekirse WebJobs SDK benim tüm Azure SDK'leri arasında en favori SDK'lerimden biri.

WebJobs candır diyerek :) bir sonraki makaleye kadar görüşmek üzere!