Delivery kapsamında veri
Middleware’den guard ve handler’a bounded typed veriyi aynı delivery içinde taşıyın.
Delivery-local map, tek bir mesajın işlenmesi sırasında aşamalar arasında veri taşır. Middleware’in hesapladığı policy sonucu veya audit bağlamı handler’da tekrar hesaplanmadan kullanılabilir. Map aynı delivery’nin scope’u ile yaşar; farklı mesajlar arasında paylaşılmaz.
Önce üretin, sonra çıkarın#
Tam guard örneği DeliveryAudit verisini before_delivery içinde ekler. Aşağıdaki parça o middleware callback’inin içindedir; exchange framework’ün verdiği QueueDeliveryExchange değeridir.
let event_id = exchange.context().event_id().into_inner().to_string();
exchange.insert_local(DeliveryAudit { event_id })?;Handler’da Local(audit): Local<DeliveryAudit> parametresi bir owned clone alır. Parts extractor’ları payload’dan önce yazılır. Local<T> için T: Clone + Send + Sync + 'static gerekir; büyük immutable veride Local<Arc<T>> kullanarak kopyalanan nesneyi küçük tutabilirsiniz.
Zorunlu ve isteğe bağlı veri#
| Extractor | Değer yoksa |
|---|---|
Local<DeliveryAudit> |
Retryable QUEUE_DELIVERY_LOCAL_MISSING |
Option<Local<DeliveryAudit>> |
None |
Required local hatası çoğunlukla üretici middleware’in kaydını veya sırasını kontrol etmeyi gerektirir. Sırf hatayı susturmak için optional yapmayın; optional, verinin bulunmamasının uygulama sözleşmesinde normal olduğu durumda uygundur. Option<E> bütün extractor hatalarını yutan genel bir mekanizma değildir.
Sınırlar ve tip kimliği#
Map en fazla 32 distinct Rust tipi tutar. Aynı tip yeniden eklenirse eski değer döner; yeni bir slot açılmaz. İki farklı anlam için aynı String tipini kullanmak yerine TenantKey(String) ve AuditLabel(String) gibi ayrı tipler tanımlayın. Boyut sınırı tip sayısı içindir; sakladığınız her değerin byte boyutunu uygulama sınırlamalıdır.
Exchange üzerinden typed local okuma, ekleme ve çıkarma yapılabilir. Local bir DI registration değildir; Service<T> ile otomatik çözülmez. Çoklu replica cache’i, durable idempotency kaydı veya veritabanı transaction’ı yerine geçmez.
Güven sınırını koruyun#
Kullanıcı kontrollü bir header’dan alınan tenant değeri doğrulanmış principal değildir. Önce gerekli imza/credential ve tenant ilişkisini doğrulayın; ardından doğrulanmış durumu ayrı bir local tipe koyun. Typed taşıma, verinin doğrulandığını kendiliğinden kanıtlamaz. Guard işleme iznini bu açık sözleşmeyle değerlendirmelidir.
Bu sayfanın kaynakları v0.1.0
Anlatım, incelenen framework commit’ine dayanır.