Rust Queue Worker
Tokio worker havuzlu bellek içi iş kuyruğu; jitter'lı exponential backoff yeniden denemeleri ve dead-letter listesi.
Problem
Küçük ve okunabilir bir worker havuzu modeli istedim: sınırlı kuyrukla backpressure, dolu kanalı kilitlemeyen retry'lar ve üretilmekte olan işleri düşürmeyen kapanış.
Mimari
- CLI üretici işleri sınırlı bir tokio::sync::mpsc kuyruğuna ekliyor. Dolu iken enqueue bekliyor; try_enqueue Full dönüyor.
- N worker iş çekiyor. Hatalar --fail-rate ile simüle ediliyor (dış I/O yok). Deneme hakkı varken ayrı bir görev uyuyup (üst sınırlı, full jitter'lı exponential backoff) yeniden kuyruğa koyuyor. Aynı sınırlı kanalda inline uyumak kuyruk doluyken kilitlenmeye yol açabilir.
- Hak bitince iş dead-letter listesine gidiyor. Metrikler: enqueued, processed (deneme), succeeded, failed, retries, dead_lettered.
- Kapanış: pending bitmemiş işi sayıyor. Worker'lar yalnızca mark_producer_finished ve pending == 0 olduktan sonra çıkıyor. Sadece pending == 0 ile çıkmak, hızlı bir worker ilk işi bitirip kanalı kapatırsa sonraki enqueue'leri düşürebilir.
Tasarım kararları
Backpressure için sınırlı kuyruk
Kuyruk kapasitesi sabit. Üreticiler enqueue'de bekler veya try_enqueue ile Full alır; sınırsız büyüme yok.
Ödünleşim: Belleği korur; sürekli aşırı yükte üretici durur veya çağrı yerine göre düşer.
Ayrı görevlerde retry
Backoff uykusu worker döngüsünün dışında; sonra yeniden enqueue. Kapasite-1 kuyrukta hak bitince dead-letter'a gider, kilitlenmez.
Ödünleşim: Dolu kanalda doğru, ama kuyruk kalıcı değil — süreç yeniden başlarsa uçuştaki işler kaybolur. Broker, ack veya reclaim yok.
Üreticiyi bilen kapanış
Worker'lar üretici bitmiş ve pending 0 olana kadar bekler; erken çıkış sonraki enqueue'lerden önce kanalı kapatmaz.
Ödünleşim: Bu bellek içi lab için doğru; üretim worker'ı değil ve cargo test gecikme ölçmüyor.
Teknolojiler
Sırada ne var
- Yeniden başlatmalar arası kalıcılık için ack/reclaim'li broker.
- Sabit fail-rate ve kuyruk kapasitesinde gecikme ölçümü.
Sonuçlar
- sınırlar, backoff, erken kapanış kaybı, kapasite-1 tükenmiş retry için cargo test
- 8/8