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:
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ı:
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.
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.
outputs('Get_items')?['body/value']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.
KullanıcıAdı), sağ tarafa ise ifadenizi (item()?['DisplayName']) yazın.item() fonksiyonu, o anki satırı temsil eder. item()?['Email'] yazarak döngüye girmeden tüm e-postaları bir kerede ayıklayabilirsiniz.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.
outputs('Select') (Sadece e-postaların olduğu dizi).; (Noktalı virgül).[email protected]; [email protected]. Bu metni doğrudan “Send an Email” aksiyonuna bağlayabilirsiniz.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.
| Özellik | Apply to Each (Döngü) | Data Operations (Döngüsüz) |
|---|---|---|
| İşlem Hızı | Her satır için ~0.5 – 2 sn | 10.000 satır için < 2 sn |
| API Tüketimi | Satır sayısı kadar aksiyon | Sadece 1 aksiyon |
| Hata Riski | Yüksek (Zaman aşımı) | Çok Düşük |
| Ölçeklenebilirlik | Düşük | Çok Yüksek |
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: