fix(worker): nack on transient handler failures, ack on permanent
Some checks failed
CI / Check / Test (push) Has been cancelled

This commit is contained in:
2026-06-12 00:30:06 +02:00
parent 17d4de461b
commit 6f34b7b5ec
2 changed files with 190 additions and 79 deletions

View File

@@ -65,12 +65,22 @@ impl WorkerService {
}
async fn dispatch(handlers: Arc<Vec<Arc<dyn EventHandler>>>, envelope: EventEnvelope) {
let mut any_transient = false;
for handler in handlers.iter() {
if let Err(e) = handler.handle(&envelope.event).await {
tracing::warn!("event handler error (non-fatal): {e}");
if e.is_transient() {
tracing::warn!("transient handler error, will retry: {e}");
any_transient = true;
} else {
tracing::warn!("permanent handler error (not retrying): {e}");
}
}
}
if let Err(e) = envelope.ack().await {
if any_transient {
if let Err(e) = envelope.nack().await {
tracing::error!("nack failed: {e}");
}
} else if let Err(e) = envelope.ack().await {
tracing::error!("ack failed: {e}");
}
}