lilydocs
HTTP APIWebSocketConsumer
Pipeline3 dk okuma

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#

Öncelik
Action #[timeout(seconds = N)]
  → controller #[timeout(seconds = N)]
  → ServerConfig::message_timeout_secs

Normal 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#

Action parçası
#[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.

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod