pg_durable ile PostgreSQL içinde dayanıklı iş akışlarını ve SQL fonksiyonlarını gösteren soyut bir diyagram.

pg_durable: PostgreSQL İçinde Dayanıklı İş Akışları Oluşturun!

pg_durable ile PostgreSQL’de Dayanıklı İş Akışları: Kron İşlerine Son!

Veritabanı yöneticileri ve arka uç mühendisleri için uzun süredir devam eden, hataya dayanıklı SQL fonksiyonları artık hayal değil. Microsoft tarafından geliştirilen açık kaynaklı pg_durable, PostgreSQL içinde dayanıklı yürütmeyi mümkün kılan bir eklentidir. Bu çözüm, durumlarını zaten Postgres’te tutan ve arka plan işlerini güvenilir hale getirmek için kron işleri, işçiler, kuyruklar ve durum tablolarını bir araya getirmekten yorulan ekipler için tasarlandı. İş akışınızı doğrudan SQL’de tanımlayın, pg_durable her adımı kontrol noktalarına kaydetsin ve çökme, yeniden başlatma veya başarısız adımlardan sonra yürütmeye kaldığı yerden devam edin.

Dayanıklı yürütme artık endüstri standardı bir desen haline geldi ve pg_durable bunu hiçbir ek hizmet altyapısına ihtiyaç duymadan PostgreSQL içine getiriyor. Bu, Microsoft’un ‘hesaplamayı veriye yakınlaştırma’ misyonunun bir parçasıdır. Microsoft’un yeni PostgreSQL bulut hizmeti olan ve performans için özel olarak tasarlanmış Azure HorizonDB‘de pg_durable’ı hemen deneyebilirsiniz.

Bu Kimler İçin Uygun?

Kimler İçin Tasarlandı?

  • Dokundukları verilerin yanında iş akışlarının da yaşamasını isteyen arka uç ve veri mühendisleri.
  • Yeniden başlatmalara dayanması gereken ve SQL’de denetlenebilir olması gereken runbookları otomatikleştiren DBA’ler ve SRE’ler.
  • Satır, belge veya toplu işlem başına dayanıklı yürütmeye ihtiyaç duyan veri veya yapay zeka işlem hatları oluşturan ekipler.

Temel Fikir

Bir pg_durable fonksiyonu, PostgreSQL’in yürüttüğü ve ilerledikçe kontrol noktalarına kaydettiği bir SQL adımları grafiğidir. Veritabanı çökerse, yeniden başlarsa veya bir adım başarısız olursa, yürütme durumu elle yeniden oluşturmanızı gerektirmek yerine son dayanıklı kontrol noktasından devam eder.

Hangi İş Yükleri İçin Kullanışlıdır?

  • Vektör gömme işlem hatları: Bölme, gömme API’sini çağırma ve pgvector’a ekleme.
  • Veri alım işlem hatları: Büyük toplu işlemleri hazırlama, tekilleştirme, dönüştürme ve yayımlama.
  • Planlanmış bakım: Şişkinliği tespit etme, bildirme, onay bekleme, ardından sonraki eylemi çalıştırma.
  • Fan-out toplama: Bağımsız sorguları paralel olarak çalıştırma, ardından sonuçları birleştirme.
  • Harici API iş akışları: SQL’den zenginleştirme, sınıflandırma ve webhook tarzı çağrılar.

Bugün Muhtemelen Yaptığınız Alternatifler

  • pg_cron artı bir iş tablosu, durum sütunları, yeniden deneme sayaçları ve bir yoklama işçisi.
  • Postgres’i geri çağıran Airflow, Temporal, Step Functions veya Argo gibi harici bir orkestratör.
  • Yeniden denemeleri ve kısmi tamamlamayı koordine etmek için bir kuyruk artı işçiler artı ayrı bir durum tablosu.
  • Bir çökme veya uzun süreli işlem sizi baştan başlamaya zorlayana kadar çalışan bir plpgsql prosedürü.

Giderdiği Sorunlar

  • Uzun süreli bir işin ortasında yeniden başlatma, zaten başarılı olan işin yeniden çalıştırılması anlamına gelir.
  • Tek bir başarısız satır veya API çağrısı, manuel temizliğe ve belirsiz tekrara dönüşür.
  • Uzun süreli işlemler kilitleri tutar, WAL’ı büyütür ve toplu işleri daha büyük ölçekte kırılgan hale getirir.
  • Uygulama katmanındaki paralel çalışma, kısmi hata hataları ve kaymalar için daha fazla yer yaratır.
  • İş akışı mantığı SQL, işçiler, kuyruklar, panolar ve durum tablolarına dağılmış durumdadır.

Mimarinizde Neler Değişir?

  • İş akışı tanımı SQL’e taşınır ve df.start(...) ile başlar.
  • Yeniden deneme durumu, ilerleme takibi ve kontrol noktaları, özel uygulama kodu yerine Postgres’e taşınır.
  • Bazı uygulama katmanı işçileri, kuyruk tüketicileri veya zamanlayıcı bağlantıları tamamen ortadan kalkabilir.
  • Operasyonel görünürlük, verilerinizle aynı kimlik doğrulama ve yedekleme modelini kullanan df.instances gibi Postgres tablolarından gelir.

Ne Zaman Kullanmamalısınız?

  • İş zaten tek bir INSERT ... SELECT veya sıradan bir SQL ifadesiyse.
  • Dayanıklı arka plan yürütmesi yerine milisaniyenin altında senkron istek işleme ihtiyacınız varsa.
  • Postgres ortamınızda uzantıları yükleyemiyor veya bir arka plan işçisi çalıştıramıyorsanız.
  • İş akışı çoğunlukla Postgres dışında yaşıyorsa ve birçok heterojen sistemi kapsıyorsa.
  • SQL adımlarına, dallanmaya, döngülere veya HTTP çağrılarına temiz bir şekilde eşleşmeyen keyfi uygulama mantığına ihtiyacınız varsa.

pg_durable Nasıl Çalışır?

  1. ~> ve |=> gibi birleştirilebilir operatörler kullanarak SQL’de bir iş akışı tanımlayın.
  2. df.start() ile başlatın ve bir örnek kimliği geri alın.
  3. Çalışma zamanının her adımı dayanıklı bir şekilde, adımlar arasında kontrol noktalarıyla yürütmesine izin verin.
  4. İş akışı çalışırken veya tamamlandıktan sonra PostgreSQL’den durumu ve sonuçları sorgulayın.

Sınırlamalar

Model kasıtlı olarak SQL şeklindedir. Bir adım keyfi kod, HTTP olmayan bir SDK veya zengin bellek içi kontrol akışı gerektiriyorsa, bu mantığı bir SQL fonksiyonuna sarmalamanız, df.http() için bir HTTP uç noktası arkasına açığa çıkarmanız veya sistemin o kısmı için genel amaçlı bir orkestratör kullanmanız gerekebilir.

Temel Özellikler

  • Dayanıklı — Fonksiyon durumu PostgreSQL’e kalıcı olarak saklanır. Çökme, yeniden başlatma ve felaket durumlarına dayanır.
  • SQL-Yerel — Birleştirilebilir operatörler kullanarak fonksiyonları SQL’de tanımlayın.
  • Veritabanı Odaklı — Zamanlama, koşullar ve paralel yürütme için birinci sınıf temel öğeler.
  • Sıfır Altyapı — Bir PostgreSQL uzantısı olarak çalışır. Redis, Temporal veya harici hizmetler yok.

Hızlı Örnek

-- Verileri adımlar halinde işleyen dayanıklı bir fonksiyon
SELECT df.start(
'SELECT id FROM documents WHERE processed = false LIMIT 100' |=> 'batch'
~> 'UPDATE documents SET processed = true WHERE id = ANY($batch)'
);

Mimari

pg_durable, pgrx ile oluşturulmuş bir PostgreSQL uzantısıdır; her şey PostgreSQL sunucusu içinde, harici hizmetler olmadan çalışır. Uzantı, fonksiyon grafikleri oluşturmak için bir SQL DSL’i açığa çıkarır ve bunları iki alt seviye Rust kütüphanesi üzerinde dayanıklı bir şekilde yürüten bir arka plan işçisi kaydeder:

  • duroxide — Orkestrasyon çalışma zamanını (deterministik tekrar oynatma, kontrol noktaları, alt orkestrasyonlar, zamanlayıcılar) sağlayan dayanıklı bir görev çerçevesi.
  • duroxide-pg — duroxide için PostgreSQL tabanlı bir durum sağlayıcısı. Çalışma zamanı durumunu (örnekler, geçmiş, iş kuyrukları) uzantıya ait özel bir duroxide.* şemasına kalıcı olarak saklar.

Eğer dayanıklı fonksiyonları Rust, Python veya Node’da yazmayı tercih edip durumu yine de PostgreSQL’de kalıcı hale getirmek isterseniz, duroxide ve duroxide-pg’yi doğrudan ana dilinizden kullanabilirsiniz. pg_durable, SQL’de yazmayı tercih ettiğinizde bu ikilinin üzerine inşa edeceğiniz şeydir.

Durum ve Destek

Bu proje şu anda Önizleme aşamasındadır. Hata raporları ve özellik istekleri için GitHub Issues kullanın. Güvenlik açıkları için lütfen genel GitHub Issues üzerinden bildirimde bulunmayın; bunun yerine SECURITY.md‘deki talimatları izleyin. pg_durable Microsoft’a telemetri göndermez ve PostgreSQL Lisansı altında lisanslanmıştır.

Comments

No comments yet. Why don’t you start the discussion?

    Bir yanıt yazın

    E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir