Hata modeli
Delivery hatalarını process hatalarından ayırın; retry kararını açık sınıf ve güvenli kodla verin.
Bir siparişin geçersiz olması ile Consumer’ın RabbitMQ bağlantısını sürdürememesi farklı hatalardır. Handler, extractor, middleware ve guard QueueHandlerError ile delivery sonucunu seçer. ConsumerError, başlangıç ve supervised process yaşam döngüsünün hata yüzeyidir.
Sınıfı uygulama seçer#
use lilyrs::queue::QueueHandlerError;
fn validate_order_id(id: &str) -> Result<(), QueueHandlerError> {
if id.is_empty() {
return Err(QueueHandlerError::permanent("ORDER_ID_REQUIRED"));
}
Ok(())
}| Sınıf | Uygun örnek | Normal policy |
|---|---|---|
permanent |
Desteklenmeyen veya kalıcı olarak geçersiz veri | Dead-letter handoff |
retryable |
Geçici olarak erişilemeyen bağımlılık | Hakkı varsa retry, tükenmişse dead letter |
Bozuk JSON built-in extractor tarafından permanent reddedilir; pozitif tutar veya aktif hesap gibi domain kuralları uygulamada doğrulanır. Her DB hatasının geçici olduğunu varsaymayın. retry_attempts=0 ise retryable sonucu da normal failure policy’de DLQ’ya gider.
Kod ve kaynak hata#
Kod &'static str, 1–64 ASCII byte ve [A-Za-z0-9][A-Za-z0-9_.-]* biçimindedir. Geçersiz kod sınıfa özgü güvenli framework koduyla değiştirilir. Kodda event ID, e-posta veya değişken hata metni kullanmayın; kararlı bir sınıflandırma seçin.
use lilyrs::queue::QueueHandlerError;
fn temporarily_unavailable(error: std::io::Error) -> QueueHandlerError {
QueueHandlerError::retryable_with_source("DEPENDENCY_UNAVAILABLE", error)
}permanent_with_source ve retryable_with_source orijinal hatayı std::error::Error::source üzerinden korur. Standart Display ve Debug hassas kaynak metnini göstermez; kendi loglarınız bu metni ayrıca açığa çıkarabilir. Kendi handler hata tipiniz için Into<QueueHandlerError> dönüşümünde sınıfı açık seçin.
Pipeline’da ilk hatayı koruyun#
Bir middleware’in normal after_delivery hatası başarılı sonucu failure’a çevirebilir; daha önceki primary failure’ı silemez. Panic, timeout ve framework cancellation başarıya dönüştürülmez. on_delivery_termination hatası cleanup kanıtıdır; önceki sonucu yeniden yazmaz ve ACK seçemez.
QueueDeliveryOutcome kaynak hata veya payload taşımayan bir pipeline görünümüdür. is_success() broker ACK’i, transaction commit’ini veya scope cleanup’ın tamamlandığını kanıtlamaz. Bu sınırın devamı settlement sayfasındadır.
Process sonucunu gözleyin#
Normal bir business rejection Consumer process’ini tek başına sonlandırmaz. Settlement, provider veya cleanup arızaları supervised runtime’ı başarısız sonlandırabilir. Consumer::run().await veya managed wait/shutdown sonucunu yutmayın. ConsumerLifecycleFailures::primary() ilk hatayı; secondary_failures() sonraki kapanış gözlemlerini saklar.
Hatalı kapanıştan sonra da shutdown raporunu inceleyin. Son görülen dispose hatasını tek sonuç olarak loglamak, başlangıçta asıl başarısız olan işlemi gizleyebilir.
Bu sayfanın kaynakları v0.1.0
Anlatım, incelenen framework commit’ine dayanır.