FDE·交付知识库
目录
需求诊断 项目切片 灰度上线 验收交接 报价期望 集成治理

模块 10 · 系统集成与边界治理

开发是自己可控的,集成要迁就别人的系统、别人的节奏、别人的历史烂账。集成的工作量通常不是「对接」,而是「对齐」。

项目锚点 · 经销商远程双签 / 黑湖小工单 / prod 写桥

三条真实集成链路:① 经销商门店远程双签——门店在手机上签认订单与工单,核心是「谁在什么状态下可以签、签了能不能撤、纠纷以谁为准」;② 黑湖小工单集成——明确哪些字段单向同步、哪些不做双向;③ prod 写桥边界治理——所有写生产库的请求必须经过写桥层,禁止业务代码直连改表。

延伸:基础 15 · 读懂 monorepo 讲你项目 4 包结构与包间引用规则(集成边界的代码级对应)。

01

为什么集成比开发难

一个系统从零开发,需求是我定的、表结构是我定的、节奏是我控的。而集成意味着:我得去动别人的东西。这四件事会同时把项目拖慢:

维度自己开发集成别人的系统
需求自己定义,自己改对方的历史包袱不能改,只能适配
节奏我说了算要看对方的版本计划和排期
数据字段想怎么设计就怎么设计字段语义可能和你的理解完全不同
责任出问题我修出问题要先分清是谁的锅
新人最常犯的错:把集成当成「调通一个接口」的技术活。实际上调通只占 20% 的工作量,剩下 80% 是对齐——对齐字段语义、对齐状态机、对齐异常处理、对齐责任边界、对齐验收口径。
一句话立论:集成的工作量通常不是「对接」,而是「对齐」。所以我报价时从来按对齐的工作量估,不按接口的数量估。
02

集成前必须先答的 5 个问题

这五个问题答不上来的,不要开工,先做接口探查。接口探查是独立的一个小交付,也可以单独收费。

#问题答不上来意味着什么怎么查
1对方系统有没有 API可能根本没有接口,只能走文件甚至 RPA,工期和稳定性都要重估看对方开放平台文档,或直接问技术对接人
2文档是否稳定、是否完整接口随时会变,你写的代码随时会挂要一份版本化的接口文档 + 一个可用的测试环境
3谁有改动权限你提的字段变更没人拍板,扯皮无解要一个明确的对接人和变更审批路径
4数据谁对不对出问题时责任无法归属,验收无法进行约定「以谁的数据为准」,并写进单据
5出错时谁负责线上故障时你在查日志、对方在查日志,没人修约定告警接收人和响应时限
红线:第3 项「谁有改动权限」和第 5 项「出错谁负责」这两条谈不拢,不要签固定总价。你承担了不受控的外部依赖风险。
接口探查的产出物接口清单字段映射表权限与责任矩阵风险清单
03

集成模式对比:五种路子的取舍

同一个业务目标,可能有五条技术路径。选错路径,代价会在上线后加倍还给你。

模式实时性开发成本稳定性适用场景
API 直连秒级中(要看对方文档质量)高,但受对方版本影响双方技术团队都在场、有正式文档和测试环境
Webhook 回调秒级中高(要处理重试、去重、验签)中,链路更长对方不方便被你轮询,需要事件驱动时
文件交换(CSV / Excel)按批次,可做到当天/每小时低高(可重跑、可人工核对)对方没有 API、或者数据量大到接口不划算
数据库直读高看似低,实则高低⚠️ 只读可以勉强接受;可写等于把生产库交出去
RPA / 人工兜底最差看起来低,长期最高最低(依赖界面和人工)只作为前三者都不可行时的最后手段,且必须写明是临时方案
选型建议:能用 API 不用文件,能用 文件 不用 RPA,RPA 是最后手段。理由很简单:前两者出了问题能查能重跑,RPA 出了问题你连它为什么错都要问一遍。
RPA 最常见的坑不是技术,是没写清楚它是临时方案。对方界面一改版,脚本全废,而你已经按它能长期运行报了价。合同里必须写:「RPA 通道在对方系统界面升级后可能失效,修复不包含在本次范围」。
04

真实案例:经销商门店远程双签

项目:德莉玛门店订购系统。业务场景:经销商门店要在手机上远程签认订单和工单——门店收到货单或工单派工后,在手机上看明细、确认签认,留痕作为后续对账和结算的依据。

为什么做成「双签」而不是一个签

一张订单实际有两个独立的确认动作:一是门店确认「我收到的是这一单」,二是技术确认「这一单按这个技术条件做」。这两件事在不同时间、由不同人、在不同状态下发生——所以链路必须是两条独立的签认记录,而不是一个签两次。

1

双签链路设计

把签认拆成两个节点,节点之间有前置依赖:门店签在前,技术确认在后,技术确认页必须能看到门店签认的明细快照。任何一个节点撤回,下游节点自动失效,不允许出现「门店撤了但技术还留着」的状态。

2

身份与时间戳留痕

每次签认落四个东西:操作人ID、角色、签认时刻(精确到秒)、设备与网络来源。时间戳统一存UTC,展示时再按门店时区渲染——这里踩过坑,见模块 11 的「口径不一致」。

3

离线兜底

门店网络经常不稳。所以签认动作先落本地队列,恢复网络后自动补传,本地保留原始签名图与快照摘要。补传走幂等键,重复提交不会产生第二条签认记录。

集成治理的核心不是接口,是三个问题:
问题不提前定会怎样本项目的定法
谁在什么状态下可以签订单已作废还能被签,或者同一单被两个人签按状态机开权限:只有「已派工」状态的门店单可门店签,只有「门店已签」状态可技术确认
签了之后能不能撤一方反悔直接改数据,留痕失效,纠纷时无法举证只能「作废重签」,不能修改或删除原签认;作废需要填原因
纠纷时以谁为准各执一词,最后谁声音大听谁的以服务端留痕为准;本地离线签名只是补传来源,不作为最终依据
这三条必须在开工前和业务方逐条确认并写进验收标准,不是开发完再讨论。它们的成本是半小时讨论,成本是上线后无限次扯皮。
05

真实案例:黑湖小工单集成 + prod 写桥边界治理

第二个案例更偏架构。背景:黑湖是第三方生产工单 SaaS,门店/生产相关的工单要和我们自己的生产数据打通。

5.1 集成原则:先定「哪些字段走哪个方向」

集成最容易出事的不是技术,是双向同步打架。两个系统都改同一条记录时,谁覆盖谁?

字段类别同步方向为什么这么定
工单号、创建时间、门店信息单向写入:黑湖 → 我方这是对方的主数据,我方只读不写,避免两边打架
工单状态流转单向写入:黑湖 → 我方状态机的解释权归对方,我方不参与判断
技术确认结论、尺寸与工艺参数只回传摘要:我方 → 黑湖回传的只是给对方看的摘要,不回传完整明细,避免黑湖侧被当成生产数据源
价格、成本、毛利任何方向都不走核心商业数据,绝不出我方边界
客户联系方式脱敏后单向第三方只需知道「送这一单」,不需要完整客户档案
凡是需要双向写同一实体的字段,一律先停下来问一句:「两边同时改听谁的」。这个问题问不清楚,说明业务规则还没想清楚,代码写了也是错的。

5.2 prod 写桥:把生产库和外层隔开

先说概念。prod 写桥是把生产数据库(prod)与外层桥接层隔开的那一层:所有要写生产库的请求,必须经过写桥;禁止任何业务代码直接连库写表。

错误做法(直连写库):
  业务服务A ─┐
  业务服务B ─┼──直连──▶ prod MySQL   ← 谁的 SQL 谁负责,没人知道
  运维脚本  ─┘

正确做法(写桥收口):
  业务服务A ─┐
  业务服务B ─┼──▶ prod 写桥 ──▶ prod MySQL
  外部集成  ─┘      │
                    ├─ 统一鉴权 / 参数校验
                    ├─ 统一幂等键
                    ├─ 统一审计日志(谁、什么时候、改了什么)
                    └─ 统一限流与失败告警

写桥本身不碰业务逻辑,它是边界层。它存在的唯一理由是:让「谁能写生产数据」这个问题有唯一答案。

核心原则:生产数据的写入口只能有一个。哪怕只有100 行代码,这100 行也必须收口在写桥里。

5.3 「谁能写生产数据」权限表

这张表是我在项目里实际落地并和运维对齐过的版本,交付时直接给客户看:

角色 / 通道读生产数据写生产数据必须走的路径留痕要求
应用服务(后端业务代码)✅ 走只读副本或主库只读连接✅ 允许必须经prod 写桥,走内部服务间认证写桥记录操作人、业务ID、变更前后值
运维脚本(修数据、导数据)✅⚠️ 原则上不允许;确需时走工单审批只读脚本直接连;写操作走写桥的运维通道并绑定审批单号脚本名、执行人、审批单号、影响行数,全部落审计表
外部集成(黑湖、第三方 SaaS)❌ 不可直连❌ 绝不允许只经对外 API 通道,写桥内部再落库按外部系统ID 记录来源,支持按来源反查和回滚
任何人按需申请🚫 不得直连改表————
只读副本最小权限账号写桥收口审计日志按来源回滚
这张表的价值:出事故时能立刻回答三个问题——是谁改的、什么时候改的、能不能回滚。没有这张表,事故处置就变成猜。
关于「数据库直读」这个模式:只读可以,写绝对不行。第三方直连读库看起来效率高,但对方拿到的是整库权限,今天读订单明天就能读价格。今天是合作方,明天可能是竞品。
06

边界治理的四条红线

集成出问题,八成不是代码写错,而是边界没管住。这四条是硬要求,不是最佳实践。

红线一 · 可观测:集成通道必须可观测。每一次调用都要有日志,每一次失败都要有告警。「失败了但没人知道」是集成项目里最贵的故障——因为它可能在三天后才被业务方发现,那时候数据已经错了三批。
红线二 · 幂等:接口必须要求幂等性。重复调用不能产生重复单据。做法是所有写操作带幂等键(建议用业务唯一键 + 请求指纹),服务端见到相同键直接返回上次结果。网络重试、消息重投、定时任务补偿,都会触发重复调用,这是常态不是异常。
红线三 · 不越权:数据边界不越权。第三方只能拿到它该拿的字段,尤其是客户数据和价格数据。原则是按调用方授权字段,而不是按表授权:同一个接口,不同调用方返回的字段集不同。价格、成本、毛利、完整客户档案默认在任何对外通道里都拿不到。
红线四 · 可降级:必须有降级预案。对方挂了不能拖垮主流程。主流程该能继续跑就继续跑,把集成的结果标为「待同步」,进重试队列,等对方恢复后补齐。判断标准很简单:把对方的接口全部断掉,我的主流程还能不能出结果?不能,就不合格。
07

集成失败的常见原因

这五类是我见过的失败原因排序,括号里是我认为最值得警惕的一项。

原因表现对策
没有真实联调环境对方只给了一个测试账号,字段结构和生产完全不同,联调通过、上线即挂开工前必须拿到真实环境或与生产同构的环境,拿不到就把「环境差异风险」写进报价单
依赖对方排期你的开发做完了,对方接口还没好,整个项目停在那里等你,但延期责任在你合同里写清对方配合事项是前置条件,并约定顺延规则;关键路径上不要只排一条路
字段语义不一致(括号里最隐蔽的一项)同一个「厚度」,我方按毫米、对方按厘米;同一个「数量」,一方按件一方按套。接口返回 200,数据全错做字段映射表并逐字段确认口径:单位、量纲、时区、是否含税、是否含包装。语义对齐必须在编码前做完
没有对账机制双方数据谁也不对谁,月底对账才发现差了三个月的数据集成第一天就定对账口径和频率:行数、金额、关键状态。详见模块 11 的对账表
失败静默(括号里最致命的一项)接口返回成功,但实际什么都没写进去——因为异常被 try/catch 吞了,或者对方内部失败了却仍返回 200写操作必须回读校验:写完立刻按业务键查一次,查不到就记为失败并告警。绝不把「返回 200」等同于「成功」
最后两项的共同点:它们都不会报错。系统看起来一切正常,数据在慢慢错。所以集成项目唯一可信的验证方式,是定期对账,而不是看接口日志。
✓

自查清单

  • ✓我能在开工前答出对方有没有 API、文档稳不稳、谁有改动权限、数据以谁为准、出错谁负责这 5 个问题
  • ✓我能说清 API / Webhook / 文件 / 数据库直读 / RPA 五种模式的取舍,并知道 RPA 是最后手段
  • ✓我在报价时按「对齐的工作量」估,不是按接口数量估
  • ✓我做过「谁在什么状态下可以签、能不能撤、纠纷以谁为准」这三件事的定义,而不是让开发自己决定
  • ✓我能说清 prod 写桥是什么,以及它存在的唯一理由是让「谁能写生产数据」有唯一答案
  • ✓我背得出那张生产数据写权限表:应用服务经写桥写 / 运维脚本只读 / 外部集成只走 API 通道 / 任何人不得直连改表
  • ✓我的集成方案里有幂等键、有失败告警、有降级预案、有字段级授权
  • ✓我知道「接口返回成功」不等于「数据写进去了」,写完必须回读校验
面试怎么答

「多个系统之间怎么整合?」

我的核心观点是:集成的工作量不是「对接」,是「对齐」。调通接口通常只占两成,剩下八成是对齐字段语义、对齐状态、对齐异常、对齐责任、对齐验收口径。所以我报价按对齐的工作量估,不按接口数量估。

第一步不是写代码,是接口探查。开工前我必须能答出五个问题:对方有没有 API、文档稳不稳、谁有改动权限、数据以谁为准、出错谁负责。这五个里只要有一个答不上来,我就不开工——先做一轮探查,产出接口清单、字段映射表、权限责任矩阵。这五个问题答不上来就签固定总价,等于替对方的历史包袱买单。

第二步选路径,顺序是:能用 API 不用文件,能用文件不用 RPA,RPA 是最后手段。原因很实在——前两者出问题能查能重跑,RPA 出问题我连它为什么错都要问一遍;而且 RPA 一定要在合同里写明是临时方案,界面一改版就失效。

举个我真实做过的例子:德莉玛门店订购系统要做经销商门店远程双签,让门店在手机上签认订单和工单。我把签认拆成两个节点——门店签在前、技术确认在后,后一个必须看到前一个的明细快照,节点之间有前置依赖,任一节点撤回下游自动失效。这里真正花时间的不是接口,是三个业务问题:谁在什么状态下可以签、签了能不能撤、纠纷时以谁为准。这三条开工前不和业务方逐条确认,代码写得再对也留不住证据。

另一个例子是黑湖小工单集成。黑湖是第三方生产工单 SaaS,我定的原则是先定清楚哪些字段走哪个方向:工单号、创建时间、门店信息、状态流转全部单向从黑湖写入我方;技术确认结论只回传摘要,不回传完整明细;价格成本毛利任何方向都不走;客户联系方式脱敏后单向。凡是需要双向写同一个实体的字段,一律先停下来问「两边同时改听谁的」——这问题问不清楚,说明业务规则没想清楚,代码写了也是错的。

这里我想重点讲一下 prod 写桥边界治理,因为这是我在架构上最坚持的一件事。prod 写桥是把生产数据库和外层桥接层隔开的那一层:所有要写生产库的请求必须经过写桥,禁止任何业务代码直连连库写表。写桥本身不碰业务逻辑,它是纯边界层,存在的唯一理由是让「谁能写生产数据」这个问题有唯一答案。业务服务可以经写桥写,运维脚本原则上只读、确需写入要绑审批单号,外部集成只经对外 API 通道,任何人不得直连改表。

为什么不直接让业务服务连库?因为服务一多,SQL 就散在各处,出事根本查不到是谁改的。走桥之后我就能立刻回答三个问题:是谁改的、什么时候改的、能不能回滚——审计日志里都有。顺带在桥上统一挂幂等键、参数校验、限流和失败告警,这是收口带来的额外收益。数据库直读这个模式我的态度是:只读可以,写绝对不行。第三方拿到整库权限,今天读订单明天就能读价格,今天是合作方,明天可能是竞品。

最后是四条必守的红线:一要可观测,每次调用有日志、失败有告警,因为集成故障最贵的形态是「失败了但没人知道」,可能三天后才发现数据已经错了三批;二要幂等,重复调用不能产生重复单据,因为网络重试、消息重投、定时补偿都会触发重复调用,那是常态不是异常;三是不越权,第三方只能拿它该拿的字段,价格成本和完整客户档案在对外通道里默认拿不到;四是要能降级,判断标准很简单——把对方接口全断掉,我的主流程还能不能出结果?不能就不合格。

一句话收口:集成治理的核心是对齐,不是对接。技术手段都可以换,但这五问、四条红线和那张写权限表是我认为真正能复用到下一个项目的东西。