Zaman Aşımı
Zaman aşımı, bir sunucunun bir yanıtı işlemek için alabileceği süreyi sınırlamak için kullanılabilir. Connect-ES'de, zaman aşımı değerleri, istemci tarafından timeoutMs
seçeneği aracılığıyla talep gönderildiğinde ayarlanır. Yanıtın işlenmesi zaman aşımından daha uzun sürerse, deadline_exceeded
hata kodu ile yanıt verirler. gRPC'de bu kavram, ayrıca zaman aşımı olarak bilinir.
HandlerContext
Kullanımı
Sunucular, bu zaman aşımını handler bağlamı aracılığıyla etkileşimde bulunabilir. İhtiyaçlarınıza bağlı olarak, bunu ele almanın birkaç yolu vardır:
İpucu: Zaman aşımı yönetimi, uygulamanızın performansını artırabilir.
İlk yol, bağlamdaki AbortSignal
üzerinden gerçekleşir. Bu sinyali kullanarak, yönlendirme işleyicileri istemcinin belirttiği zaman aşımının aşıldığını belirtebilir ve süreçlerini buna göre durdurabilir. AbortSignal
, signal
isimli özellik aracılığıyla bulunabilir.
Sinyal, diğer fonksiyonlara geçirilerek veya zaman aşımı gerçekleştiğinde veya RPC döndüğünde süreçleri nazikçe durdurmak için kullanılabilir. signal
kullanımı, API destekliyorsa, çağırmak istediğiniz herhangi bir işlem için geçerlidir.
import type { HandlerContext } from "@bufbuild/connect";
const say = async (req: SayRequest, ctx: HandlerContext) => {
ctx.signal.aborted; // zaman aşımı gerçekleşirse true
ctx.signal.reason; // zaman aşımı gerçekleştiyse deadline_exceeded kodlu bir hata
// zaman aşımı gerçekleşirse deadline_exceeded kodu ile bir hata verir
ctx.signal.throwIfAborted();
// AbortSignal diğer fonksiyonlara aktarılabilir
await longRunning(ctx.signal);
return {sentence: `Dedin ki: ${req.sentence}`};
};
Zaman aşımı değeriyle etkileşime geçmenin ikinci yolu, handler bağlamındaki timeoutMs()
fonksiyonu aracılığıyladır. Eğer mevcut talepte bir zaman aşımı belirlenmişse, bu fonksiyon kalan süreyi döndürür.
Bilgi: timeoutMs()
fonksiyonunun kullanılması, yukarı akışta RPC çağrıları yaparken daha verimli ve sağlamdır.
timeoutMs()
fonksiyonunun kullanılması, yukarı akışta RPC çağrıları yaparken daha verimli ve sağlamdır; çünkü karşı tarafın zaman aşımının farkında olacağını garanti eder, ağ sorunlarından bağımsız olarak. gRPC'de bu kavram, ayrıca zaman aşımı yayılımı olarak bilinir.
import type { HandlerContext } from "@bufbuild/connect";
const say = async (req: SayRequest, ctx: HandlerContext) => {
// Eğer bu hizmete yapılan çağrıda bir zaman aşımı belirlendiyse, timeoutMs() metodu
// kalan süreyi milisaniye cinsinden döndürür.
// Değerin yukarı akıştaki bir istemci çağrısına geçirilmesi, zaman aşımını yayar.
await upstreamClient.someCall({}, { timeoutMs: ctx.timeoutMs() });
return {sentence: `Dedin ki: ${req.sentence}`};
};
Ayrıca, zaman aşımına yönelik sunucu tarafı desteğine ek olarak, ConnectRouter
üzerinde zaman aşımı değerlerini kısıtlamaya yardımcı olan bir seçenek vardır: maxTimeoutMs
. Bu seçeneğin açıklaması için, Sunucu Eklentileri
dökümantasyonuna bakın.
Ayrıca, bu sayfanın zaman aşımını bir sunucu bağlamında ele aldığını belirtmek gerekir, Connect-ES istemcileri zaman aşımı değerlerine uyar ve DeadlineExceeded
kodu ile bir ConnectError
raise eder. Bir bağlantı yanıtsız kalırsa bile, istemci çağrısı yapılandırılmış zaman aşımında iptal edilir.
try {
// Eğer bu çağrı 200 milisaniyeden fazla sürerse, iptal edilir
await client.say({sentence: "Merhaba"}, { timeoutMs: 200 });
} catch (err) {
if (err instanceof ConnectError && err.code === Code.DeadlineExceeded) {
// zaman aşımı hatasını ele al
}
}