Umut ABALI
← Projelere dön

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

Rust Queue Worker mimari diyagramıenqueuesuccessfail + attempts leftre-enqueueexhaustedproducer (CLI)bounded mpscenqueue · try_enqueueN workersfail-rate · backoffsucceededretryexp. backoff + jitterdead-letter
rust-queue-worker README mimari diyagramından: üretici → sınırlı mpsc → worker'lar → başarı / retry / dead-letter.
  • 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

RustTokiompsctracing

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
Yük altında uçtan uca gecikmeBenchmark yakında