Description
GigExpiryWorkerService.runOnce() (src/gig/gig-expiry-worker.service.ts) iterates this.gigService.findExpirable() in a plain for...of loop, awaiting webhookService.dispatch(...) for each expired gig one at a time. WebhookService.dispatch() (src/webhook/webhook.service.ts) itself fans out to all registered endpoints with retries (up to 3 attempts with growing backoff per endpoint), so a sweep with many simultaneously-expiring gigs and a slow/unreachable webhook endpoint serializes all of that retry latency across the whole batch, potentially causing one sweep's runOnce() to still be running when the next interval tick fires. This is a single-instance throughput concern, distinct from the multi-instance coordination work tracked in #182.
Component
Backend
Difficulty
🟡 Medium
Tasks
Acceptance Criteria
Estimated Time
1 day
Description
GigExpiryWorkerService.runOnce()(src/gig/gig-expiry-worker.service.ts) iteratesthis.gigService.findExpirable()in a plainfor...ofloop,awaitingwebhookService.dispatch(...)for each expired gig one at a time.WebhookService.dispatch()(src/webhook/webhook.service.ts) itself fans out to all registered endpoints with retries (up to 3 attempts with growing backoff per endpoint), so a sweep with many simultaneously-expiring gigs and a slow/unreachable webhook endpoint serializes all of that retry latency across the whole batch, potentially causing one sweep'srunOnce()to still be running when the next interval tick fires. This is a single-instance throughput concern, distinct from the multi-instance coordination work tracked in #182.Component
Backend
Difficulty
🟡 Medium
Tasks
Promise.allSettledover chunks) instead of a fully sequential looprunOnce()is still in flight when the timer fires)Acceptance Criteria
Estimated Time
1 day