Skip to main content

Resilience: hbf-broadcast

Error handling and retry patterns for this service. Platform-wide patterns: docs/architecture/resilience.md

HTTP Retry

  • Library: Mixed (deprecated request for Facebook, axios for Slack)
  • Attempts: Facebook: 5 (manual retry loop); Slack: 3 (exponential backoff on 5xx)
  • Backoff: Facebook: none; Slack: (e^attempt - 2*random) * 1000ms; DB fetch: exponential, 3 attempts
  • On failure: Facebook classifies errors via shouldKeepError() to decide resend or drop; Slack propagates after retries

Queue Retry (if applicable)

N/A

Timeouts

CallTimeoutConfigured in
All HTTP requestsNot setN/A

Circuit Breakers

None.

Fallback Strategy

Failure scenarioBehaviourUser impact
Facebook send failureshouldKeepError() determines resend vs dropSome messages silently dropped
Individual broadcast failurePromise.allSettled() isolates failures per recipientOther recipients unaffected
DB fetch failure (fetchNonReceiversFromDB)Returns empty array after 3 retriesBroadcast proceeds with incomplete recipient list

Known Gaps

  • No timeout on any HTTP request (requests may hang indefinitely).
  • Inconsistent retry strategies across channels (Facebook: 5 attempts, no backoff; Slack: 3 attempts, exponential backoff).
  • No circuit breaker for downstream channel APIs.
  • No health endpoint.