:第三方提醒失败也不能丢业务事实)
系列第 15 篇把喵提醒放在业务事务之外严格区分第三方接受、明确失败和结果未知并用限频摘要避免提醒轰炸。候选、交换和截止事件已经写进数据库接下来才轮到外部提醒。这个顺序非常重要第三方接口变慢、停服或喵码失效都不能让用户刚刚发布的信息或已经形成的交换消失。HTTP 200 不代表成功Gate A 实测发现成功、参数错误和提醒单不存在都返回 HTTP 200 与纯文本。K7 的适配器因此同时判断两层2xx 正文严格等于“完成” → 第三方已接受 2xx 参数格式有误/找不到提醒单 → 明确拒绝 5xx → 第三方失败 超时、断连、未知正文 → 结果未知页面显示“第三方已接受”不显示“微信已送达”。只有接收端真正确认才能证明送达接口响应做不到。结果未知为什么不能重试超时时服务端可能已经收到并处理请求只是响应没有回来。喵提醒也没有提供调用方可见的幂等键或结果查询接口。若自动重试用户可能收到两条完全相同的提醒。Gate A 已经实际证明相同请求会重复触发。因此 UNKNOWN 是终态记录下来、保留站内提醒但不自动发送第二次。业务事实先于渠道结果数据关系是业务事件 ├─ 接收者 A 的站内提醒 ├─ 接收者 A 的外部投递结果 ├─ 接收者 B 的站内提醒 └─ 接收者 B 的外部投递结果Worker 只修改某一条投递记录。测试让第一个接收者明确失败十秒后第二个接收者成功最终两个状态分别保留候选和双方站内提醒都没有回滚。没有启用渠道时投递标为“仅站内”用户仍能在提醒中心看到事实。喵码只在发送瞬间解密数据库保存版本化密文。Worker 取得租约后在后端解密只把喵码交给渠道适配器。浏览器、分享文案、业务事件 payload 和普通日志都不包含喵码。正式正文也固定为发现新的同路信息请返回邻行查看司机或乘客身份、路线、时间和微信号都留在登录后的邻行页面不发送给第三方。设置页的“发送测试提醒”改为使用同一渠道工厂测试环境使用假渠道生产配置为喵提醒时走同一适配器。明确拒绝不会把账号标为已验证更不会删除账号页面还会提示用户确认微信端实际收到。数据库租约和十秒间隔待办领取使用短事务、select_for_update(skip_locked)和一分钟租约。外部网络调用发生在领取事务之后不长期占用数据库锁。Worker 查询最近一次实际调用时间下一次不足十秒时只调整计划时间不发送。这个间隔是出口全局约束而不只是单个用户约束符合 Gate A 的官方建议。第四条开始合并摘要同一用户、同一条出行信息在滚动一小时内最多发送三条即时提醒。第四条不会立刻请求第三方而是计划到窗口结束后发送摘要后续事件合并到同一个摘要并增加计数。注入时钟测试在 0、10、20 秒发送前三条30 秒处理第四条时没有调用渠道第五条被标记为已合并待发送摘要计数变成 2。这不是删除事件。每个站内提醒仍然存在只是外部渠道把多个提示合成一次。本节点结果111 个非浏览器测试通过1 个 PostgreSQL 专属测试跳过分支覆盖率 88.09%静态、类型、迁移和 Django 检查通过4 条 Chromium 旅程通过成功、拒绝、500、超时、断连、未知正文、故障隔离、十秒间隔和摘要均有自动证据Gate A 的双用户真实送达记录继续作为外部证据本节点没有保存测试喵码WebKit、微信成品真机和正式试用仍未宣称通过结果只形成本地提交不推送。下一篇进入 K8用户申请删除后怎样立即停止新披露在 24 小时、90 天和 180 天三个时间边界清理不同数据同时让社区管理员只能使用被允许的管理能力。关键代码与操作下面的参数化测试展示为什么不能只检查 HTTP 状态码还必须对白名单正文做严格分类pytest.mark.parametrize((status_code,body,expected),[(200,完成,DeliveryStatus.DELIVERED),(200,发送失败参数格式有误,DeliveryStatus.REJECTED),(500,service failed,DeliveryStatus.FAILED),(200,unexpected,DeliveryStatus.UNKNOWN),],)deftest_response_requires_http_and_whitelisted_body(status_code,body,expected):channelMiaotixingChannel(transportlambdaurl,timeout:TransportResponse(status_code,body))outcomechannel.send(NotificationMessage(example-code,candidate,event:1,最小正文))assertoutcome.statusisexpected验证命令make bugfix TESTtests/notifications/test_miaotixing_channel.py::test_response_requires_http_and_whitelisted_body示例隐藏了真实提醒凭据和网络请求超时与断连还要单独断言为 UNKNOWN。本篇验证摘要业务事件和站内提醒先提交第三方调用失败不会回滚产品事实渠道结果严格区分已接受、明确拒绝和结果未知未知结果不自动重试Worker 使用数据库租约领取任务网络调用不会长期占用业务事务全局十秒间隔和一小时摘要限制外部提醒频率但不删除站内事件测试覆盖成功、拒绝、500、超时、断连和未知正文真实页面只声称第三方已接受。附录相关工具与仓库gstack仓库garrytan/gstack地址https://github.com/garrytan/gstackdev-harness仓库Dev-Wiki/dev-harness地址https://github.com/Dev-Wiki/dev-harnessUI UX Pro Max Skill仓库nextlevelbuilder/ui-ux-pro-max-skill地址https://github.com/nextlevelbuilder/ui-ux-pro-max-skill