Fire & Forget Nedir? Nerelerde Kullanılır?
Fire & Forget, her ne kadar Targaryen Hanedanı sözleri gibi gözükse de, asıl anlamını “Tetikle ve Unut” şeklinde düşünebiliriz. Sonucunu…
Fire & Forget Nedir? Nerelerde Kullanılır?
Fire & Forget, her ne kadar Targaryen Hanedanı sözleri gibi gözükse de, asıl anlamını “Tetikle ve Unut” şeklinde düşünebiliriz. Sonucunu umursamayacağımız ve dolayısıyla da yanıt süremizi etkilemesini istemediğimiz yerler için kullanılan bir terim aslında.

Hepimiz yaptığımız uygulamalarımızda, ister sunucu taraflı olsun ister istemci taraflı olsun, belli loglamalar yapmaktayız. Ya da kullanıcının belli aksiyonları sonrası, kullanıcıya bir mail, SMS, push bildirimi gitmesini istiyoruzdur.
Yazılımda hangi dil olursa olsun, asenkron -zaman uyumsuz- programlamayı bir şekilde kullanıyoruz. Asenkron programlamanın sağladığı anahtar kelimeler de (async/await) bize asenkron programlama yaparken kod yazım kolaylığı da sağlamakta. Peki gerçekten her şeyi await etmeli miyiz?
Await’i niye kullanırız? Mesela DB’ye doğru bir asenkron çağrım yapmaktayız. Bu DB’den gelen sonucu bir şekilde kullanacağız. O halde bizim bu sonucu beklememiz yani “await” etmemiz gerekiyor.
Kullanıcımız bir işlem tetikledi. Mesela para transferi yaptı ve biz de o kullanıcının hesap bakiyesini güncelleyeceğiz. Sonrasında ise kullanıcıya bu para transfer işleminin başarılı olup olmadığı ile ilgilli geri bildirimde bulunacağız. Geri bildirim yapabilmemiz için bir takım işlemleri beklemek zorundayız. Kabaca ortalama işlem setlerini en basit haliyle şöyle özetleyebiliriz:
- Kullanıcının girdiği bilgiler doğru mu? (IBAN vs.) (+ 2 ms)
- Kullanıcının bu transfer için yeterli bakiyesi var mı? (+ 50 ms)
- IBAN başka bankaya mı ait? Duruma göre EFT, FAST ya da Havale. (+ 150 ms)
- Kullanıcıya bilgilendirme SMS’i/maili ve push bildirimi gönder. (+ 300 ms)
- Kullanıcının işlemini logla. (+200 ms)
Tabi bunun çok çok fazlası işleniyor arkada ve süreler de tamamen uydurma değerler. Uzun uzun bu meselelere girmeyeceğim. Bütün bu muazzam işlemler ortalama 702 ms gibi sürelerde tamamlanabiliyor. Aradaki veri transfer ile geçen zamanlar da dahil edilerek kullanıcıya bunun yanıtı 1 saniye civarında dönebiliyor. Ancak kullanıcı bütün bu aşamaların tamamlanmasını beklemek zorunda mı?
İlk 3 madde iş kuralları gereği ve kullanıcıya bir geri bildirim sağlama zorunluluğundan dolayı beklenmesi gerekiyor. Kullanıcının yeterli bakiyesi olduğunu kontrol etmeden, işleme devam etmek bütün bankaları batırırdı muhtemelen. Para transfer yönetiminin türünü de bildireceğim için, 3. maddenin de beklenmesi gerekiyor haliyle. Peki kullanıcı 4. ve 5. aşamaları beklemeli miydi? Bir kullanıcıya işleminin başarılı gerçekleştiğinin haberini vermek için önce loglama yapmam gerekiyor muydu? İşte burada await’siz bir işlem çalıştırılmalı. Bu sayede kullanıcıya 500 ms daha erken cevap verebiliriz.
Diyelim ki aşağıdaki gibi bir Task’ımız var. (Future, Promise, Task hangi dil size uygunsa ona göre düşünebilirsiniz burayı)
async Task<bool> ReallyLongLoggingJob() {
await Task.Delay(5000);
Console.WriteLine("Really Long Job Is Completed");
return true;
}
Hepimizin alışkın olduğu üzere bu methodu aşağıdaki şekilde çağırıyoruz.
public async Task<IActionResult> SendSomeMoney() {
// Business logics here...
bool retval = await ReallyLongLoggingJob();
return Ok("Money is sent with success");
}
Ancak ben kullanıcıya loglamanın başarılı olup olmadığı ile ilgili bir bildirim yapmayacağım muhtemelen. O halde benim bu Task’ı await ile beklememe gerek yok. Sonucu false da dönse, o an umursamayacağım bunu. Loglamayı kontrol eden farklı devrelerimin olması gerekiyor nasıl olsa. Bu true ve false değerlerini farklı bir thread üzerinde kullanmaya devam edebilirim. Kullanıcıya yanıtımı ise çoktan dönmüş olacağım ve sistemimde yaşanan hatalardan daha minimum seviyede etkileniyor olacak.
public async Task<IActionResult> SendSomeMoney() {
await ControlIfIbanIsValid();
await ControlIfCustomerHasEnoughFunds();
await CheckMoneyTransferType();
// Other business logics here...
ReallyLongLoggingJob(); // No await here.
return Ok("Money is sent with success");
}
Bu sayede kullanıcıya yanıt döndükten sonra arkada loglama işlemim devam edecektir. Tabi bugünün best practicelerinde, bu tarz yapılar için backendde mesajlaşma ve kuyruk yapıları da kullanılmaktadır.
Bir de sonuçları görelim. İlk sonuçta bu gereksiz uzun Task’ımızı beklediğimiz bir örneği göreceğiz. Gördüğünüz üzere kullanıcıya yanıtı 5 saniyede dönebilmişim.
Start of Awaited Method
Really Long Job Is Completed
End of Awaited Method!
Response sent in: 00:00:05.0188461
İkinci sonuçta ise 1 ms’nin bile altında bir yanıt sürem var. (Gerçek dünyada imkansız :)) Çünkü uzun süren bu Task’ın sonucu kullanıcıyı ilgilendirmeyeceği için kullanıcıyı bu Task için bekletmedim.
Start of Non-Awaited Method
End of Non-Awaited Method!
Response sent in: 00:00:00.0002038
Really Long Job Is Completed
Ayrıca bu yazımda çok uçuk bir örnek verdim. Arka planda çalışıyor ve kullanıcı yanıt süresini etkilemiyor olsa bile, bir işin 5 saniye sürmesi sistemde büyük kaynak problemlerine yol açabilir. Bununla ilgili gerekli timeoutların ve hata yönetimlerinin de yapılandırılması büyük önem taşımakta.
메타데이터
- post_id
- d50c99fa9593
- slug
- fire-forget-nedir-nerelerde-kullanılır-d50c99fa9593
- url
- https://medium.com/vakifbank-teknoloji/fire-forget-nedir-nerelerde-kullan%C4%B1l%C4%B1r-d50c99fa9593
- canonical_url
- https://medium.com/vakifbank-teknoloji/fire-forget-nedir-nerelerde-kullan%C4%B1l%C4%B1r-d50c99fa9593
- author_url
- https://medium.com/@idylmz
- status
- ok
- fetched_at
- 2026-06-22 17:31:34