feat(python/robomp): added automatic event retry scheduling with backoff delays

- Added event retry settings with parsed delay schedules and jittered delay computation.
- Extended event persistence to persist an `available_at` timestamp, honor it during dequeuing, and clear it when re-queuing.
- Updated worker failure handling to queue bounded retries with backoff and transition to failed only when the retry budget is exhausted.
This commit is contained in:
can1357
2026-06-14 09:15:18 +02:00
parent 4a2417c92f
commit 46ea12f1a1
6 changed files with 318 additions and 7 deletions
+19 -2
View File
@@ -301,8 +301,25 @@ class WorkerPool:
self.db.mark_event(row.delivery_id, "failed", error="cancelled by operator")
else:
tb = traceback.format_exc(limit=20)
log.exception("event handler failed", extra={"delivery": row.delivery_id})
self.db.mark_event(row.delivery_id, "failed", error=f"{exc}\n{tb}")
err = f"{exc}\n{tb}"
max_retries = self.settings.event_max_retries
delay = self.settings.retry_delay_seconds(row.attempts)
if 0 < row.attempts <= max_retries and self.db.schedule_retry(
row.delivery_id, delay_seconds=delay, error=err
):
log.warning(
"event retry scheduled",
extra={
"delivery": row.delivery_id,
"key": row.issue_key,
"attempt": row.attempts,
"max_retries": max_retries,
"retry_in_seconds": round(delay, 1),
},
)
else:
log.exception("event handler failed", extra={"delivery": row.delivery_id})
self.db.mark_event(row.delivery_id, "failed", error=err)
finally:
self._cancelled.discard(row.delivery_id)
self._shutdown_cancelled.discard(row.delivery_id)