Sync vs Async: Bu Kararı Nasıl Veriyorum
Kullanıcı bekliyor mu, telafi var mı

Kararı teknolojiyle başlamıyorum. Ekranda bir insan var mı, o insan bir sonuç mu bekliyor, sonuç gelmezse ne diyeceğiz? Bu üç cümle netse, senkron/async neredeyse kendiliğinden düşüyor. Net değilse, kuyruk bir örtü olur.
Örtünün altı: 'sipariş alındı' deyip stoğu sonra denemek, stok yoksa gece iptali. Bunu ürün olarak seçtiyseniz async doğru. Seçmediyseniz, kuyruk sizi seçmiş olur. Ben seçilmek istemiyorum.
Üç soru
- Kullanıcı bu isteğin sonucunda bir sayı, bir stok, bir yetki mi bekliyor?
- Karşı taraf düşünce bu istek de mi düşmeli?
- Yarım kalırsa telafi cümlemiz var mı, yoksa destek mi uyduracak?
Bir ve iki evet, üç hayırsa senkron. Stok rezervi, ödeme yetkisi, kuponun o an geçerli olup olmadığı. Kullanıcıya yalan söylememek, 80 milisaniyelik bir çağrıya değer. Çağrı 2 saniyeyi geçiyorsa sorun async değil, karşı tarafın sağlığı.
Bir hayır, iki hayırsa async. Mail, arşiv, arama indeksi, 'arkadaşın katıldı' bildirimi. Bunlar isteği ayakta tutmamalı. Tutuyorsa, p95 başkasının SMTP'sine bağlanmış demektir.
Karışık yol
Checkout sık karışık. Kartı yetkilendirmek senkron. Fiş maili async. Fatura PDF'i async. Sadakat puanı... ürüne göre. Puan ekranda hemen görünecekse senkron veya en azından aynı işlem. 'Birazdan düşer' denebiliyorsa kuyruk.
public async Task CheckoutAsync(Checkout cmd, CancellationToken ct)
{
var auth = await payments.AuthorizeAsync(cmd.Card, cmd.Amount, ct);
if (!auth.Approved)
return CheckoutResult.Rejected(auth.Reason);
var order = Order.Accept(cmd, auth.Reference);
db.Orders.Add(order);
db.Outbox.Add(OutboxMessage.From(new OrderPlaced(order.Id)));
await db.SaveChangesAsync(ct);
return CheckoutResult.Accepted(order.Id);
}
Burada ödeme cevabı kullanıcıya ait. {OrderPlaced} dinleyenlere ait. Mail worker'ı düşünce sipariş durmaz. Ödeme düşünce sipariş oluşmaz. İkisini aynı 'async olsun' torbasına koymuyorum.
Zaman bütçesi
Senkron çağrının bir bütçesi var. 300 ms iç servis, 2 saniye dış ödeme, üstüne kendi işim. Bütçe bitince kullanıcıye net hata. Sessizce kuyruğa devretmek, bütçeyi ihlal etmek. 'Timeout olursa async devam' ancak telafi varsa; yoksa çift çekim riski.
Async'in de bütçesi var: ne kadar geç olabilir? Arama indeksi 10 saniye eski kalabilir. Stok görünümü belki 1 saniye. Muhasebe kaydı 'yarın' olamaz. Gecikme sınıfı yazılmadan kuyruk, sınıfsız bir borç.
Kararı bir kez verip dondurmuyorum. Mail sağlayıcısı bozulunca bildirim senkron hale gelmesin diye uğraşmam; düşmeye izinli. Ödeme ağı bozulunca checkout'u kuyruğa almak ise başka bir ürün: 'ödeme bekliyor' durumu, ekran, hatırlatma. Onu tasarlamadan geçiş yapmam.
Sync/async bir zevk meselesi değil. Bekleyen kim, yalan söyleyecek yer var mı, telafi kimin işi. Üçü yazılınca kuyruk bir araç. Yazılmayınca kuyruk bir bahane.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap