滨州项目|万医生可配置异步推送方案
总开关、After-Commit 任务、独立 Worker、幂等重试与主流程强隔离
开关关闭(默认)
wanyisheng_sync_enable=0
不创建任务、不调用万医生,人员、体测、支付、订单、退款完全保持现有业务逻辑。
开关开启
wanyisheng_sync_enable=1
本地主事务成功提交后,尽力登记异步任务;独立 Worker 后台推送,第三方失败不影响原业务。
总体流程
原业务事务提交并确定结果 → After-Commit 检查开关 → 关闭则结束;开启则在主事务外尽力登记任务 → 立即保持原响应 → 独立 Worker 组装快照并推送 → 成功 / 重试 / 人工处理。
主流程零影响硬门禁
- 禁止在人员、健康、支付、订单、退款主事务内写推送任务表或调用万医生接口。
- After-Commit 登记任务必须捕获所有异常且不得再次抛出;任务表不存在、写入失败或日志失败,原业务仍按原结果返回。
- Worker 使用独立进程、独立超时、限流与熔断;停机、崩溃、超时、4xx/5xx 和重试耗尽只改变推送任务状态。
- 推送状态只写任务表,不复用或回写订单、退款、支付、体测等主业务状态,也不得重新执行主业务命令。
- 进程在提交后、登记任务前崩溃的窗口由补偿扫描发现;不能为了避免漏推而让主流程等待。
验收标准 故障注入前后,现有接口响应、事务提交、订单/退款状态、金额及健康结果必须一致。
全局强制适用
人员、健康标签、Mocatch、体重管理、宅客报告、全部消费订单、餐饮退款、补偿扫描、人工重推、群体展开、Worker 和重试全部使用同一个 wanyisheng_sync_enable 开关。
- 只有开关读取成功且严格等于
1才允许登记或发送。 - 配置缺失、非法、数据库或缓存读取异常一律按关闭处理。
- 关闭或读取失败时不登记、不展开、不补偿、不重推、不发送,同时原业务照常执行。
- 任何新增登记点如果没有开关控制和异常隔离,不得发布。
配置建议
| 配置 | 默认值 | 作用 |
|---|---|---|
wanyisheng_sync_enable | 0 | 总开关,事件登记和 Worker 发送双重检查 |
wanyisheng_sync_timeout | 5 秒 | 可选,HTTP 超时 |
wanyisheng_sync_batch_size | 20 | 可选,单批任务数量 |
wanyisheng_sync_max_retry | 5 | 可选,最大自动重试次数 |
初始化放在 store/db/config.sql,默认关闭;App Secret 不写入可提交 SQL、普通日志或前端可见配置。请求使用 App ID、毫秒时间戳、唯一 nonce 和 HMAC-SHA256 签名。
三个业务事件
| 类型 | 登记时机 | 幂等键 |
|---|---|---|
| 健康档案 | 人员健康信息提交后;一次体测 session 完整落库后 | health_profile:userId |
| 订单 | 滨州所有完成的消费订单均纳入,不因订餐、外部/Shop、自提、取餐柜等来源排除;统一发送 dine_in_order,人工、设备和定时自动完成均触发 | order:orderNo |
| 退单 | 退款真正成功后;发送前保证原订单已同步 | refund:refundNo |
任务与 Worker
- 任务表只存业务标识、状态、脱敏错误,以及重试一致性所需的非敏感菜品规格快照;不保存身份证、手机号或完整健康 payload。
- 订单菜品
spec保持对象结构:specName由ydy_dishes.unit → ENUM3.enum_name转成“碗/份/盘”等中文文本,specId使用稳定派生值dishes_uuid:unit。 - 首次生成订单任务时快照
specId/specName/dishPrice/estimatedWeight/weightUnit,后续重试沿用快照;空单位传空字符串并记脱敏异常,不擅自默认“份”。 - 同一用户多次变化合并为最新健康快照;同一订单/退款不重复创建任务。
- Worker 发送前再次查开关;关闭后不领取、不发送、不增加重试次数。
- 网络/5xx 按 1 分钟、5 分钟、15 分钟、1 小时、6 小时重试;确定性 4xx 进入人工处理。
- 关闭期间的数据不自动补推;历史补数必须人工选择范围后生成任务。
必须通过的故障测试
分别模拟任务表缺失/写失败、Worker 被杀、DNS 失败、连接超时、HTTP 400/500、无效 JSON、重复事件、并发 Worker、日志写失败;逐项证明原接口响应与主业务数据库结果不变。
实施切片
- 配置与任务表。
- After-Commit 登记、独立 Worker、HTTP Client、重试、熔断与脱敏日志。
- 健康档案事件。
- 订单事件。
- 退款事件及原订单依赖。
- 补偿、人工重推、状态查询与故障注入测试。
当前为设计方案,未修改业务代码、正式 SQL、Supervisor 或生产配置。正式开发前需确认发布版本和 Worker 部署方式。