Power Automate’te Yüksek Performanslı Akışlar: Neden “Loop-Free” Tasarım?

Modern kurumsal otomasyonlarda hız, sadece bir “tercih” değil, sürdürülebilirlik için bir zorunluluktur. Geleneksel yöntemlerle tasarlanan ve her bir veri satırı için döngüye giren akışlar; veri hacmi arttıkça hantallaşır, zaman aşımına uğrar ve Microsoft’un Power Platform için belirlediği Request Limits (İstek Limitleri) duvarına çarpar.

“Döngüsüz” (Loop-Free) tasarım, akışın binlerce veriyi tek tek değil, tek bir hamlede (bulk processing) işlemesini sağlar. Bu yaklaşıma özellikle şu durumlarda ihtiyaç duyarız:

  • Büyük Veri Setleri: SharePoint, Dataverse veya SQL üzerindeki binlerce satırlık veriyi saniyeler içinde raporlamak veya güncellemek istediğinizde.
  • API Kotası Yönetimi: Microsoft’un sunduğu günlük işlem limitlerini hızla tüketmeden, daha az maliyetle daha çok iş yapmak için.
  • Gerçek Zamanlı İhtiyaçlar: Kullanıcının sonuç beklediği “Power Apps tetiklemeli” akışlarda gecikmeyi (latency) minimuma indirmek için.

Teknik Rehber: “Apply to Each” Döngülerini Veri İşlemleriyle Değiştirme

Power Automate geliştiricileri için en büyük yanılgı, bir veri dizisi (array) üzerinde işlem yapmanın tek yolunun döngü kurmak olduğudur. Oysa döngüler, her bir satır için ayrı bir “Action” tetiklediği için hem zaman hem de Microsoft Graph API limitlerini tüketir. İşte bu süreci teknik olarak nasıl optimize edeceğinizin detayları:

1. Katmanda Filtreleme: OData ve Sunucu Tarafı Optimizasyonu

Performansın ilk kuralı, işlenmeyecek veriyi akışın içine hiç almamaktır. “Get Items” (SharePoint) veya “List Rows” (Dataverse) aksiyonlarında bulunan Filter Query alanı, veriyi henüz buluttayken filtreler.

Teknik Detay: Status eq 'Approved' and Created ge '2024-01-01' gibi bir OData sorgusu yazdığınızda, akışınız 10.000 satırı çekip içinden 100 tanesini aramak yerine, doğrudan o 100 satırı teslim alır. Bu, bellek kullanımını %90 oranında azaltır.

2. “Filter Array” ile Bellek İçi Filtreleme

Veriyi çektiniz ancak akışın farklı aşamalarında bu veriyi farklı kriterlere göre bölmeniz gerekiyor. Tekrar bir döngü kurup “Condition” (Koşul) eklemek yerine Filter Array kullanın.

  • From: outputs('Get_items')?['body/value']
  • Condition: Sol tarafa dinamik içerik (örneğin Departman), ortadaki operatör is equal to, sağ tarafa ise Satış.
  • Sonuç: Sistem, binlerce satırlık JSON dosyasını saniyeler içinde tarar ve sadece kriterinize uyan yeni bir JSON dizisi oluşturur.

3. “Select” Aksiyonu: JSON Şemasını Yeniden Modelleme

En kritik aşama burasıdır. Genellikle bir döngü içinde Append to array variable (Dizi değişkenine ekle) kullanarak verileri toplarız. Bu işlem her adımda değişkeni yeniden yazdığı için çok yavaştır. Select aksiyonu ise bu işlemi toplu (bulk) olarak yapar.

  • From: Önceki adımdan gelen filtreli dizi.
  • Map (Key-Value): Sol tarafa sütun adı (Örn: KullanıcıAdı), sağ tarafa ise ifadenizi (item()?['DisplayName']) yazın.
  • İleri Seviye İpucu: item() fonksiyonu, o anki satırı temsil eder. item()?['Email'] yazarak döngüye girmeden tüm e-postaları bir kerede ayıklayabilirsiniz.

4. “Join” ile Diziyi Metne Dönüştürme

Filtrelediğiniz ve seçtiğiniz verileri (örneğin e-posta listesi) bir e-posta gövdesine veya rapora dökmeniz gerekiyorsa devreye Join girer.

  • From: outputs('Select') (Sadece e-postaların olduğu dizi).
  • Join with: ; (Noktalı virgül).
  • Çıktı: [email protected]; [email protected]. Bu metni doğrudan “Send an Email” aksiyonuna bağlayabilirsiniz.

5. Koleksiyon Fonksiyonları ve Gelişmiş İfadeler

Döngüsüz tasarımın gerçek gücü, WDL (Workflow Definition Language) fonksiyonlarında saklıdır. Örneğin, iki farklı listeden gelen verileri karşılaştırmak için iç içe döngüler kurmak yerine intersection() fonksiyonunu kullanarak ortak kayıtları milisaniyeler içinde bulabilirsiniz. Benzer şekilde, first() ve last() fonksiyonları ile bir dizinin başındaki veya sonundaki veriye döngüye girmeden doğrudan erişebilirsiniz. Eğer verilerinizde mükerrer kayıtlar varsa, union(variables('Dizi'), variables('Dizi')) ifadesiyle tek bir hamlede “Distinct” (benzersiz) bir liste elde edebilirsiniz.

Teknik Özet ve Performans Karşılaştırması

ÖzellikApply to Each (Döngü)Data Operations (Döngüsüz)
İşlem HızıHer satır için ~0.5 – 2 sn10.000 satır için < 2 sn
API TüketimiSatır sayısı kadar aksiyonSadece 1 aksiyon
Hata RiskiYüksek (Zaman aşımı)Çok Düşük
ÖlçeklenebilirlikDüşükÇok Yüksek

Sonuç

Power Automate’te performans, kullandığınız aksiyonların sayısı kadar doğru aksiyonları seçmekle de ilgilidir. “Apply to Each” döngüleri hızlı prototipleme için faydalı olsa da, üretim ortamında veri hacmi büyüdükçe ciddi bir darboğaza dönüşür. OData filtreleme, Filter Array, Select, Join ve koleksiyon fonksiyonlarını ustalıkla kullanan bir geliştirici, aynı işi yüz kat hızlı ve on kat daha az API tüketimiyle tamamlayabilir.

Bir sonraki akışınızı tasarlarken kendinize şunu sorun: “Bu döngüyü gerçekten kurmak zorunda mıyım, yoksa tek bir Data Operation ile aynı sonucu alabilir miyim?” Cevap, büyük ihtimalle ikincisi olacaktır.

Bu yazıda ele aldığım konular ve teknik yaklaşımlar için aşağıdaki videodan referans aldım. Konuyu görsel olarak takip etmek isteyenler için şiddetle tavsiye ederim: