镜像:读的人都读镜像

第 3 课 · 共 7 课 约 7 分钟

数据源留在原地,发布端只推变化;断了,页面看得见。

本课目标

读完这一课,你将能够

  • 说出「镜像」和「直连」的区别,以及发布端在其中做什么
  • 按数据源的类型,选「源头推送」还是「增量探针」
  • 说出数据源断了,为什么页面上能看得出来

原件留在原地

镜像不是把数据复制一份放着不管。它是数据源在 Semantic 里的只读映像:发布端装在数据源旁边,只出站,发现变化才把一批数据推上来;Semantic 按顺序落账,几秒内通知订阅它的应用。应用、智能体和 SQL 读的都是这一份。

  1. 01数据源ERP、MES、OA,只读
  2. 02发布端变了才推,只能往一条数据流发布
  3. 03变化账按序落账,保存最新状态
  4. 04对象绑定成订单、工单这样的对象
  5. 05读的人应用、智能体、SQL 读同一份

关键是「读得多,变得少」。一个数据源被几十个脚本各查一遍,多数查询的结论都是「没变」。镜像把几十份查询收成一份增量,数据源也不再被轮流敲。

怎样发现变化

发布端之后的链路,对所有数据源都一样;不同的只是怎么知道「变了」。能推送就推送;源头推不了,才在数据源旁边放一个便宜的增量探针。

最好:源头推送其次:增量探针
SAP业务事件、IDoc / 变更指针按录入时间或计数器增量读
SQL ServerChange Tracking / CDC(DBA 开启一次)rowversion 或更新时间水位;都没有时,对「当天范围」做汇总指纹
PostgreSQL逻辑复制、LISTEN / NOTIFY只读热备:按复制位置门控,限频查询
金蝶 / 用友 / SaaS ERP开放平台 webhook、业务事件订阅开放 API 按修改时间增量拉
OA流程节点动作调 HTTP按流程表的修改时间水位
企业微信 / 钉钉 / 邮件事件回调、Stream 模式、IMAP IDLE—

探针也有讲究:只问「有没有变」(水位、版本号),变了才取明细;一个探针服务所有订阅者,不是每个看板一个。

断了,要看得见

直连加定时任务最危险的一点是静默:数据源断了,脚本照样「跑完了」,页面停在昨天。镜像反过来——每条数据流都带着发布端的健康状态。

HEARTBEAT

在线 / 离线

发布端每 30 秒一次心跳;90 秒没有,订阅端就看到「离线」。

STATUS

正常 / 部分异常 / 连不上数据源

适配器每一轮自报健康。数据源不通时,页面可以直接写「数据可能不是最新」。

RETRY

不丢、不重

发布失败带着幂等 id 重试;订阅端断线后按序号续传。

CALIBRATE

定期校准

每 6 小时一次全量校准,纠正长时间累积的偏差。

别把镜像用歪

  • 探针查明细:探针每一轮都全量取数再比对,它就成了新的定时任务。探针只问「有没有变」,变了才取明细。
  • 一个看板一个发布端:一个数据源一条数据流,多个应用订阅;不要每个看板各装一个。
  • 拿镜像做要求精确的决定:镜像有延迟,通常是几秒到几分钟。要一锤定音的操作,回到数据源确认。
  • 把明细全推上来:数据流只收声明过的字段;证件号、银行卡、密码这类字段直接拒绝。

要点

  • 镜像是数据源在 Semantic 里的只读映像:原件留在原地,读的人都读镜像。
  • 能推送就推送;源头推不了,才用便宜的增量探针,且只问「有没有变」。
  • 一个数据源一条数据流,多个应用订阅,不是每个看板一个发布端。
  • 数据流带着发布端的健康状态:断了,页面看得见,不再静默变旧。

练一练

给一个数据源设计镜像

选你最常被读的那个数据源。

写下它有什么变化信号:推送事件、Change Tracking 或 CDC、更新时间水位,还是都没有。

小测

选一个答案,马上看解析。

Q1数据源不支持推送,只有一列「最后更新时间」。发布端应该怎么做?

Q2看板上出现「数据可能不是最新」,说明什么?

Q3为什么一个数据源只需要一条数据流?

延伸阅读