Deadline ve cancellation
Normal mesajın tek süre bütçesini, cooperative cancellation’ı ve bağımsız cleanup yetkisini doğru kullanın.
Bir mesajın normal pipeline'ı tek absolute deadline kullanır. Cancellation sinyali işlemin durmasını ister; future'ın veya dış sistemdeki yan etkinin kesin olarak bittiğini tek başına kanıtlamaz.
Süreyi seçin#
Action #[timeout(seconds = N)]
→ controller #[timeout(seconds = N)]
→ ServerConfig::message_timeout_secsNormal timeout 1..=300 saniyedir. Before middleware, bütün guard'lar, extractor'lar, action, response hazırlığı ve normal reverse middleware aynı bütçeyi paylaşır. Her aşama için yeni tam süre başlamaz.
Sinyali gözleyin#
#[message("bounded")]
#[timeout(seconds = 2)]
async fn bounded(&self, stopping: ExecutionCancellation, deadline: MessageDeadline)
-> Result<NoReply, WebSocketActionError>
{
let work = tokio::time::sleep(std::time::Duration::from_millis(10));
let _remaining = deadline.remaining();
tokio::select! {
biased;
_ = stopping.cancelled() => Ok(NoReply),
_ = work => Ok(NoReply),
}
}Tam controller dosyası import'ları içerir. ExecutionCancellation observe-only'dir; .cancel(), raw token, child token veya .0 erişimi sağlamaz. Dış operation kendi token'ını istiyorsa cache/Mongo örneğindeki açık köprüyü kurun.
Cooperative pencere#
Lokal timeout execution sinyalini tetikler. Framework normal pipeline'ı en fazla 250 ms cooperative pencere içinde poll etmeyi sürdürür; shutdown root sınırı bunu kısaltabilir. Yeni cancellation sebebi pencereyi yeniden başlatmaz.
Pipeline bu sırada gerçek sonuçla dönerse success veya uygulama hatası korunur. Sinyal gelmesi sonucu otomatik timeout'a çevirmez. Bitmezse execution slot durdurulur; cleanup ve scope tamamlanma sahipliği sürer. Sağlıklı bağlantıda gereken kanıtlar tamamlanınca sonraki mesaj işlenebilir; tipik lokal hata keep-open MESSAGE_TIMEOUT olur.
Bağımsız bütçeler#
| Alan | Varsayılan | Kapsam |
|---|---|---|
message_timeout_secs |
30 s | Bütün normal mesaj pipeline'ı |
message_cleanup_timeout_secs |
10 s | Aggregate termination exit'leri |
connection_middleware_timeout_secs |
10 s | Handshake/identity/admit/opened invocation, aggregate closed |
connection_lifecycle_timeout_secs |
30 s | Connected/disconnected invocation default'u |
handshake_timeout_secs |
10 s | Upgrade sınırı |
write_timeout_millis |
5000 ms | Write/flush; shutdown'da ortak terminal/Close drain cap |
outbound_admission_timeout_millis |
5000 ms | Kuyruk kapasitesi bekleme |
Inbound bekleme, scope disposal ve transport işi normal mesaj deadline'ına yeni aşamalar gibi eklenmez. Cleanup kendi CleanupCancellation sinyalini alır; normal execution'ın sinyalini cleanup'a aktarmayın.
Garanti sınırı#
Normal shutdown yeni kabulü durdurur; zaten seçilmiş action'ı sırf drain başladı diye hemen cancel etmez. Execution'a ait send yetkisi cancellation sinyalinde anında değil, cooperative execution cutoff'ta kaldırılır.
Senkron bloklayan poll, codec veya destructor Tokio tarafından ortasında durdurulamaz. DB commit veya partial broadcast cancellation ile geri alınmış sayılmaz. Özellikle PostgreSQL cancellation tipi WebSocket tipinden farklıdır; HTTP örneğindeki Some(cancellation) burada derlenmez.
Bu sayfanın kaynakları v0.1.0
Anlatım, incelenen framework commit’ine dayanır.