Couchbase kullanılan projelerde zamanlanmış (schedule) görevler oluşturmak

Rohat Şahin
Trendyol Tech
Published in
3 min readMay 28, 2020

Merhaba. Bu yazımızda Couchbase kullanacağımız projelerde zamanlanmış görevlerimizi nasıl oluşturabileceğimiz örneklendirip, kullanabileceğimiz yerleri ve kazanımlarımızı anlatacağız.

Öncelikle zamanlanmış görev (schedule task) ile üzerinde duracağımız kavramdan bahsedecek olursak, belirli zaman aralığında çalıştıktan sonra bitiş zamanın gelmesi ile sona ermesini beklediğimiz ya da belirli koşulları saglamış ve başlangıç zamanının gelmesi ile statüsünü değiştirip aktif olacak datamız olarak özetleyebiliriz. Bir ürünü belirli zaman aralıklarında satıştan çekme, açma yada onaylanmış bir kampanyanın başlangıç tarihi geldiği zaman satışta statüsüne geçmesini örnek gösterebiliriz.

Couchbase ise nosql bir veritabanı çözümü ve data üzerindeki gerçekleşen işlemlerini kendi içinde özelleşen servisleri ile yönettiği bir yapıya sahip. Yazımızda bize yardım edecek olan ise eventing servisi olacak. Eventing ile datamızda gerçekleşecek değişimleri izleyip yönetebileceğiz ve sunmuş olduğu özellikleri ile zamanlanmış görevlerimizi oluşturacağız.

Girişimizi gerçekleştirdiğimize göre bir örnek ile nasıl bir yol izleyeceğimizi açıklayabiliriz. Örneğimiz de onay statüsünde olan ve başlangıç tarihi geldiği zaman aktif olmasını istediğimiz bir kampanyayı nasıl aktifleştireceğimizi anlatacağız.

Öncelikle zamanlanmış görev ile bu işi nasıl yaptığımızı örnekleyelim. Elimizde onaylandı statüsünde bir kampanya datası var ve önümüzdeki zaman içerisindeki bir anda iptal edilmediği sürece başlangıç tarihi geldiği anda aktifleşmesini istiyoruz, bunu koda döker ise aşağıdaki gibi bir şey bizim için çözüm olabilecektir.

Örnek kod parçası inceleyecek olursak, beş dakika aralıklarla çalışıp veritabanından onaylı statüsünde olan kampanyaları çekip başlangıç tarihine ulaşanları aktive etmekte. Uygulamamızın birden fazla ortamda çalışması nedeniyle oluşması muhtemel race condition’ların önüne geçmek için de distributed bir lock (withLock) ile birlikte çalışmaktadır.

Couchbase ile bu süreci oluşturmak istediğimizde ise eventing service’nin bize saglamış olduğu fonksiyon özelliklerinden yararlanacağız. Couchbase eventing fonksiyonları data üzerinde geçekleşen crud veya expiry operasyonları sonrasında javascript ile yazdığımız ve couchbase eventing platformu üzerinde çalışan kod parçacıklarımız olarak tanımlayabiliriz. Bir bakıma serverless yapılar ile benzerlik göstermekte.

Tanımlayacağımız fonksiyon ile kampanya datası üzerindeki değişimleri takip edip kampanya statüsü onaylandığı anda kampanyanın başlangıç zamanını referans alan bir timer yaratacağız. Oluşturduğumuz timer fonksiyonu çalışma zamanına ulaştığı anda ilgili kampanya için gerekli olan servisine curl ile http isteği yapıp kampanya statüsünü aktifleştirecektir. Bunu gerçekleştirmek için yazacağımız fonksiyonun örneği ise aşağıdaki gibi olacaktır.

Yazdığımız fonksiyonu inceleyecek olursak, OnUpdate(doc, meta) fonksiyonu data üzerindeki her değişimde eventing servisi tarafından çalıştırılacak method olacaktır, ardından approved statüsüne ulaşan kampanyalar için ise eventing servisinin sağlamış olduğu timer özeliğini kullanarak createTimer fonksiyonu ile kampanya başlangıç zamanını referans alan bir event yaratacağız. Eventimizi yaratırken ki verdiğimiz onSaleTimer isimli callback fonksiyonumuz ile timer fonksiyonumuz çalışma zamanına ulaştığı anda eventing servisi tarafından sağlanan cUrl fonksiyonu ile external servisimize kampanya datamızı bildirerek satışa açma işlemlerinin başlamasını sağlayacağız. Burada ki source_bucket ve apiUrl olarak kullandığımız değişkenler ise fonksiyon deployment işlemi sırasında verdiğimiz ortam spesifik değişkenleriniz olacaktır.

Deployment adımlarını ve örnek fonksiyonlar için buradaki dökümanlar üzerinden ilerleyerek sizlerde kendi fonksiyonlarınızı oluşturabilirsiniz.

Zamanlanmış görevlerimizi couchbase eventing fonksiyonlarına çevirdikten sonra kazanımlarımızın üzerinden ilerleyerek neden yaptığımızı açıklamak istersek:

  • Zamanlanmış görevlerimizi scale etmiş olduk. Tüm kampanyaların aynı saate başlayacağı bir durumda tek ortam üzerinde çalışan job yavaşlayabilir yada çok fazla data üzerinde işlem yapmamız halinde öngöremediğimiz kaynak sıkıntıları (bellek, cpu) ile karşılaşacağımız için işlemlerimiz gecikebilir yada hatalar oluşabilir.
  • Belirli zaman aralığında çalışmasını istediğimiz (bir ürün 2 gün yayında kalsın gibi) görevlerimiz için bir ara statü oluşturma gereksinimini ortadan kaldırıp (on going gibi) kod karmaşıklığımızı azaltmış olduk.

Son olarak kullanabileceğimiz başka durumlar için örnek verecek olursak:

  • Arşivlenmesini istediğimiz aktif olmayan datalarımız için fonksiyonlar oluşturabiliriz. (kapanışı üzerinden 15 gün geçmiş)
  • Datalarımızı zenginleştirebiliriz.(döküman yaratıldıktan sonra başka servislere bağımlı datalarımızı alabiliriz. (data enrichment)
  • Data değişimleri sonucunda gerekli olan sistemlere yada başka data kaynaklarına bildirimler gönderebiliriz.

ve aklımıza gelebilecek daha fazlası…

Umarım faydalı bir yazı olmuştur. Okuduğunuz için teşekkürler.

--

--