Konuyu Açan
#1
Bir sohbet arayüzünde modeli parça parça yanıtlatmak kolay; asıl sorun kullanıcı sekmeyi kapattığında sağlayıcıya giden üretimin devam etmesi. Birkaç denemede, istemci bağlantısını iptal sinyaline bağlamanın hem gereksiz işi hem de bekleyen istekleri azaltmak açısından önemli olduğunu gördüm.
Express benzeri bir sunucuda yanıt akışı kapanırken AbortController’ı tetiklemek mümkün. Burada
İkinci mesele geri basınç: sağlayıcı hızlı veri gönderirken istemci yavaş okuyorsa, parçaları gelişigüzel biriktirmek belleği şişirebilir. Akışı mümkün olduğunca parça parça iletmek ve iptal durumunda upstream gövdesini de kapatmak daha sağlıklı. Ayrıca iptal hatasını sıradan sunucu hatası gibi loglayıp alarm üretmemek gerekiyor; kullanıcı navigasyonu çoğu zaman beklenen bir durum.
Siz üretimde bu akışı nasıl yönetiyorsunuz:
Express benzeri bir sunucuda yanıt akışı kapanırken AbortController’ı tetiklemek mümkün. Burada
close olayını doğrudan iptal saymak yerine writableEnded kontrolü eklemek önemli; normal tamamlanan yanıt da kapanış olayı üretebilir.KOD
12345678910111213
const controller = new AbortController();
res.on('close', () => {
if (!res.writableEnded) controller.abort();
});
const upstream = await fetch(modelUrl, {
method: 'POST',
headers,
body: JSON.stringify(payload),
signal: controller.signal
});
İkinci mesele geri basınç: sağlayıcı hızlı veri gönderirken istemci yavaş okuyorsa, parçaları gelişigüzel biriktirmek belleği şişirebilir. Akışı mümkün olduğunca parça parça iletmek ve iptal durumunda upstream gövdesini de kapatmak daha sağlıklı. Ayrıca iptal hatasını sıradan sunucu hatası gibi loglayıp alarm üretmemek gerekiyor; kullanıcı navigasyonu çoğu zaman beklenen bir durum.
Siz üretimde bu akışı nasıl yönetiyorsunuz:
AbortController yeterli mi, yoksa sağlayıcı SDK’larının kendi iptal mekanizmalarını da ayrıca bağlıyor musunuz?