Customer.io Reliability Patterns 是一个用于为 Customer.io 集成实现可靠性与容错模式的技能。其目标产出包括:一个幂等、可观测的事件投递设计,具备自主的重试、重放与死信决策;以及一套恢复流程,在部分失败期间保护用户同意、事件顺序和收件人体验。
主要能力(模式)
-
熔断器(Circuit Breaker):通过 CLOSED、OPEN、HALF_OPEN 三态状态机阻止级联失败。默认失败阈值 5 次、成功阈值 3 次、重置超时 30 秒。当处于 OPEN 状态时,Customer.io 调用被阻止并抛出错误。
-
带抖动的重试(Retry with Jitter):对瞬时错误进行有界指数退避重试。默认最多重试 3 次,基础延迟 1000 毫秒,延迟按 2 的幂增长并附加最多 30% 的随机抖动。不重试 4xx 客户端错误(429 除外)。
-
降级队列(Fallback Queue):使用 BullMQ 与 Redis 构建队列,在熔断器打开时暂存失败操作。默认尝试 10 次,指数退避从 1 分钟开始,完成后保留 1000 条、失败保留 5000 条。Worker 以并发 5 处理 identify、track、suppress 操作。
-
弹性客户端(Resilient Client):组合熔断器、重试与降级队列。identify 与 track 方法在熔断器打开时将操作入队而非抛出异常,非熔断错误仅记录日志而不使应用崩溃。
-
幂等守卫(Idempotency Guard):基于 SHA-256 哈希(操作、用户 ID、数据)生成 16 位键,使用内存 Map 记录已处理操作,TTL 为 5 分钟,最大条目 100000,超出时清理过期条目。
-
健康检查端点(Health Check Endpoint):暴露熔断器状态、失败计数和最后失败时间。健康时返回 200,否则返回 503。
错误处理策略
- 提供商返回瞬时失败:使用有界指数退避重试并保留幂等键。
- 事件可能重复:在触发下游动作前按稳定的事件/关联键去重。
- 重放可能重发客户消息:要求进行同意/分群审查,仅重放限定范围的失败集合。
- 死信队列增长:通知负责人,隔离格式错误的负载,在批量重放前修复契约。
使用方式
资料提供了完整的 TypeScript 代码示例,包括 lib/circuit-breaker.ts、lib/retry.ts、lib/customerio-fallback.ts、lib/customerio-resilient.ts、lib/idempotency.ts 以及 routes/health.ts。使用前需具备可用的 Customer.io 集成、对失败模式(429、5xx、超时、DNS 失败)的理解,并推荐使用 Redis 支持基于队列的模式。
适用场景
- 瞬时 5xx 错误:重试与抖动(必须)。
- 长时间 Customer.io 中断:熔断器加降级队列(必须)。
- 重试导致的重复事件:幂等守卫(建议)。
- 应用不能因追踪而崩溃:优雅降级(必须)。
- 需要可靠性可见性:健康检查端点(建议)。
可靠性检查清单
熔断器已实现且阈值合理;重试具备指数退避与抖动;熔断打开时操作进入降级队列;重试操作具备幂等守卫;所有 Customer.io 调用包裹在 try/catch 中;健康检查暴露熔断器状态;优雅关闭时排空队列并刷新缓冲区;HTTP 调用配置超时。
限制
资料未提供具体的收费、价格、平台支持范围或性能效果数据。该技能依赖 Customer.io 集成、Redis(推荐)以及 Node.js 环境(示例使用 TypeScript、bullmq、customerio-node)。后续步骤建议转向 customerio-load-scale 进行负载测试与扩展。