Queue service ve handler'lar
Bir DI servisini queue handler sahibi yapın ve etkin kayıtların nasıl seçildiğini öğrenin.
Queue service, bir veya daha fazla mesaj handler'ını barındıran DI servisidir. Servisin lifetime'ı DI tarafından, handler'ın mesaj sözleşmesi #[queue] tarafından, fiziksel kuyruğun çalışma politikası configuration tarafından belirlenir.
Worker servisini kaydedin#
use lilyrs::{
consumer::{Injectable, ServiceTrait},
queue::{Json, QueueHandlerError, queue, queue_service},
};
use serde::Deserialize;
#[derive(Deserialize)]
struct OrderCreated { order_id: String }
#[derive(Default, Injectable)]
#[service(lifetime = "Singleton")]
struct OrderWorker;
impl ServiceTrait for OrderWorker {}
#[queue_service]
impl OrderWorker {
#[queue("orders.created", version = 1, content = "json")]
async fn created(&self, Json(event): Json<OrderCreated>) -> Result<(), QueueHandlerError> {
println!("{}", event.order_id);
Ok(())
}
}Bu parça ilk uygulamanın worker bölümüdür; process girişinde Consumer::run().await kullanılır. Injectable DI kaydını, queue_service handler metadata'sını oluşturur. Worker'ı ayrı modüle taşıdığınızda o modül derlenen Rust modül ağacına dahil edilmelidir.
Makro ve imza kuralları#
| Kural | Kanonik kullanım |
|---|---|
| Impl | Non-generic inherent impl Worker |
| Dış attribute | Argümansız #[queue_service], service marker'larının üstünde |
| Handler | async fn name(&self, ...) -> Result<(), E>; E: Into<QueueHandlerError> |
| Parametre | Owned extractor; en çok 16 extractor |
| Payload | En çok bir terminal payload extractor; son sırada |
| Queue marker | Açık queue, version, content; son argümandan sonra virgül yok |
&mut self, generic handler, referans extractor veya unit dışı success değeri bu sözleşmeye uymaz. #[queue] serbest fonksiyona konulmaz. concurrency, retry ve retention macro argümanları değildir; configuration altında yer alırlar.
Bir kuyrukta birden fazla sözleşme#
(orders.created, 1, json) → OrderWorker::created_v1
(orders.created, 2, json) → OrderWorker::created_v2
(orders.created, 2, binary) → OrderWorker::created_binary_v2Her queue/version/content tuple'ı benzersizdir. Bu örnekte TOML'de tek orders.created physical queue entry bulunur; üç ayrı handler bu kuyruğun mesajlarını sözleşmeye göre işler. Aynı tuple'ı başka worker'da yeniden kaydetmek startup hatasıdır; kayıt belirsizliği ilgili kuyruk o config'te pasif olsa da kabul edilmez.
Geçerli linked handler'ın queue adı configuration'da yoksa o handler aktif tüketim oluşturmaz. Buna karşılık configured physical queue için hiç handler bulunmaması hatadır. Queue seçimi publisher header'ına göre farklı process'leri yönlendiren bir broker özelliği değildir; rollout sırası replica'ların kabul ettiği sürümleri hesaba katmalıdır.
Servis lifetime ve pipeline#
Singleton worker ortak, thread-safe uygulama durumunu tutabilir. Scoped worker ise kabul edilmiş delivery'nin scope'u içinde, middleware ve guard'lardan sonra çözülür. Singleton owner zorunluluğu yoktur; ancak owner'ın DI kaydı bulunmalıdır. İş servisini handler'da almak için Service extractor kullanın.
Service ve handler seviyesinde #[middleware(Type)] veya #[guard(Type)] marker'ları uygulanabilir. Her marker bir type alır ve en dış #[queue_service] tarafından işlenir. Detaylı kayıt sırası middleware ve guard sayfalarındadır.
Bu sayfanın kaynakları v0.1.0
Anlatım, incelenen framework commit’ine dayanır.