lilydocs
HTTP APIWebSocketConsumer
Çalıştırma3 dk okuma

Graceful shutdown

Yeni kabulü durdurun, kabul edilmiş işi tamamlayın ve kaynakları gerçek sonlanma kanıtından sonra kapatın.

Graceful shutdown yalnızca listener'ı kapatmak değildir. Lily yeni bağlantı ve mesaj kabulünü durdurur, kabul edilmiş işi ve cleanup'ı izler, kaynakları kullanan işin sonlandığını doğrulamaya çalışır.

Kapanışı başlatın#

start().await platform sinyallerini dinler. start_with_cancellation(token) üst uygulamanın sinyalini aynı akışa bağlar. Başka bir owner app.close().await çağırabilir. Aynı app için eşzamanlı/tekrarlı close çağrıları aynı sonucu gözler; her seferinde yeni timeout başlamaz.

Bu yardımcı fonksiyon için Cargo.toml içindeki [dependencies] bölümüne tokio-util = "0.7" ekleyin.

Üst uygulama için fonksiyon
use lilyrs::websocket::WsApp;
use tokio_util::sync::CancellationToken;

async fn serve(app: WsApp, stop: CancellationToken)
    -> Result<(), Box<dyn std::error::Error>>
{
    app.start_with_cancellation(stop).await?;
    Ok(())
}

stop token'ının caller tarafındaki klonu iptal edildiğinde kapanış başlar. Hiç start edilmemiş app de close ile kapatılmalıdır. Async sonucu beklemeden yalnız app değerini düşürmek cleanup tamamlandığı anlamına gelmez.

Normal drain sırası#

Shutdown akışı
Yeni Upgrade ve message kabulünü kapat
  → bekleyen inbound application mesajlarını bırak
  → kabul edilmiş action ve scope cleanup'a fırsat ver
  → kabul edilmiş terminal frame'leri drene et
  → 1001 Going Away / lily.v2.server_shutdown
  → bounded peer Close bekleme ve transport kapanışı
  → hook, task ve scope sonlanma kanıtları
  → app'e ait backplane, DI ve telemetry kaynakları

Normal drain, seçilmiş action'ı sırf kapanış başladı diye hemen cancel etmez. Yeni Text/Binary mesajlar dispatch edilmez; protocol trafiği okunabilir. Write timeout shutdown'da terminal drain, Close ve peer yanıtı için ortak cap'tir.

Execution ve gönderim yetkisi#

Kabul edilmiş execution ve cleanup callback'leri aktif invocation yetkileriyle awaited send deneyebilir. Daha önce saklanmış context/proxy veya raw spawned task bu callback'in drain yetkisini miras almaz.

Cancellation bildirimi cooperative pencere içindeki send'i anında kaldırmaz. Execution cutoff veya invocation sonu yetkiyi bitirir. Deadline sayfası sinyal, cooperation ve cleanup ayrımını açıklar.

Sonucu yorumlayın#

Olay Gösterdiği Tek başına göstermediği
Cancellation istendi Sonlandırma isteği iletildi Task join, SQL rollback
Action döndü Gerçek normal sonuç var DI close veya peer teslimi
Frame queued Local kuyruk kabulü Write/flush veya client işleme
Scope sonlandı İlgili scope cleanup sonucu var Bütün app task'ları sonlandı
App close başarılı Gerekli framework kapanış işi doğrulandı Geçmiş her mesaj teslim edildi

Timeout cleanup başarısı olarak gösterilmez. Close hatası yalnız user cleanup başarısızlığı da olabilir, gerçek child sonlanmasının doğrulanamaması da. Dış container sahibi bu durumları ayırmadan container'ı koşulsuz kapatmamalıdır; application örneği app başarıdan sonra container'ı kapatır.

Ortak bütçe ve dış işler#

Graceful, forced ve final reconciliation aynı absolute root budget içinde ilerler; her faz sıfırdan süre açmaz. [lifecycle].shutdown_timeout_secs üst sınırı config'te seçilir. Kapanış teşhisleri tracing üzerinden gözlenir; public shutdown report accessor yoktur.

Bloklayan kullanıcı future poll'ü/destructor'ı veya framework dışında başlatılan task sihirli biçimde durdurulamaz. add_background_service::<T>() ile kaydedilmiş worker'ları Lily ortak bütçe içinde cancel eder ve gerçek sonlanmalarını bekler; sonra scope ve owned DI cleanup ilerler. Worker cancellation'ı BackgroundCancellation alır, mesaj ExecutionCancellation'ı değildir. Raw task'ların stop/join sorumluluğu uygulamanızda kalır; kayıtlı worker olmak shutdown sırasında yeni WebSocket send yetkisi vermez.

Bu sayfanın kaynakları v0.1.0

Anlatım, incelenen framework commit’ine dayanır.

HIZLI BAŞLANGIÇ
Dokümantasyon
Kaynak kod