老板要“实时”,财务要“准确”,这两件事往往不是同一条链路能同时满足的
统计平台做到一定阶段,一定会遇到这个问题:
- 运营说:我想看今天到现在为止的下单量,刷新就能看到;
- 财务说:我要的是最终确认的数,退款、取消都要扣掉;
- 老板说:为什么日报和实时看板的数字不一样?
这三个需求,指向的是两种统计方式:实时统计和离线统计。
它们不是“谁替代谁”的关系,而是各有各的适用场景。设计统计平台,很重要的一件事就是把两者分清楚,并且让它们的差异可解释。
一、三种时效
实际业务里,统计的时效通常分三档:
| 时效 | 延迟 | 典型场景 | 典型指标 |
|---|---|---|---|
| 实时 | 秒级到分钟级 | 大促监控、异常告警、运营值守 | 当前下单量、支付量、失败率 |
| 准实时 | 几分钟到一小时 | 小时级经营看板 | 小时趋势、渠道对比 |
| 离线 | 小时级到天级 | 日报、月报、财务结算 | 营收、完成率、结算金额 |
三档不是技术炫技,而是成本和确定性的取舍:
- 越实时,链路越长、成本越高、越容易受乱序和重试影响;
- 越离线,数据越稳定、越容易重算,但时效性差。
二、实时统计适合什么
实时统计的价值,是让问题尽早暴露:
- 大促期间下单量突然掉零;
- 某个渠道支付成功率骤降;
- 某类商品退款率异常升高。
这类场景要的是“快”,不是“精确到分”。所以实时统计通常只看过程指标:
- 当前下单量、支付量;
- 当前转化率、失败率;
- 当前各渠道占比。
实时统计不适合直接对外承诺最终数字,因为它有两个天然缺陷:
- 数据可能还没到齐:消息延迟、重试、乱序,都会让数字短暂偏低或偏高;
- 状态可能还会变:刚下的单可能取消,刚支付的单可能退款。
所以实时数字更适合“看趋势、看异常”,而不是“做结算、做考核”。
三、离线统计适合什么
离线统计的价值,是给一个确定的答案:
- 昨天到底成交了多少;
- 这个月营收是多少;
- 退款、取消、坏账都扣完之后,利润是多少。
离线统计的优势:
- 数据完整:等所有变更都落定再算;
- 可重算:口径变了、数据错了,可以按区间重跑;
- 可对账:和财务、渠道账单对得上。
代价是时效:T+1 是常态,能做到小时级已经不错。
四、为什么实时和离线的数字会不一样
这是统计平台最常被问的问题,也是设计时就要想清楚的。
差异通常来自四个地方:
第一,数据没到齐。 实时链路里,一条变更从产生到可查,有延迟;离线统计等所有数据到齐才算。
第二,状态还没定。 实时把“刚支付”算成成交,离线会把后面退款的单扣掉。
第三,时间口径不同。 实时按“事件发生时间”算,离线按“业务确认时间”算。
第四,去重方式不同。 实时为了快,可能用近似去重;离线可以精确去重。
这些差异本身不是 bug,但必须可解释。如果用户问“为什么差 3%”,平台要能回答:差在哪些单、差在哪个环节。
做不到可解释,实时和离线就会变成两个互相打架的数字。
五、两种统计怎么共存
比较稳妥的做法是:一份定义,两套执行,差异可查。
- 定义只有一份:指标的名称、口径、时间字段、过滤条件,实时和离线共用;
- 执行可以两套:实时走流式链路,离线走批量链路;
- 差异可查:同一区间,实时结果和离线结果要能对比,差异要能定位到单。
在这个基础上,再约定使用边界:
- 实时看板只展示过程指标,并标注“数据可能有延迟”;
- 日报、月报、结算使用离线结果;
- 需要对外承诺的数字,一律以离线为准。
这样用户就不会拿实时数字去对财务账,也不会拿离线数字去判断“现在有没有异常”。
六、实时统计的设计要点
实时链路比离线链路脆弱,设计时要重点处理五件事:
窗口。 统计“最近 5 分钟”“今天到现在”,窗口边界要统一,不能每个页面自己算。
去重。 消息可能重复,同一单可能被算多次;要用单据标识去重,而不是简单累加。
乱序。 事件到达顺序可能和发生顺序不一致,尤其是跨表变更;需要按事件时间处理,而不是到达时间。
回撤。 已统计的数据可能被修正(取消、退款),实时结果要支持“减回去”,不能只增不减。
幂等。 重试、重放、补偿都可能重复执行,写入必须幂等。
这五点里,任何一点没做好,实时数字都会“看起来在动,但不可信”。
七、离线统计的设计要点
离线链路相对稳定,但也不是“跑个任务就行”:
- 分区:按天或按小时分区,便于重算和回溯;
- 补数:支持按区间重跑,补数必须幂等;
- 依赖:任务之间有依赖关系,上游没完成不能跑下游;
- 重算:口径变更、数据修复后,要能指定区间重算,而不是全量重跑;
- 校验:每个任务产出后做基本校验(行数、金额、空值),异常要阻断下游。
离线统计的核心不是“算得快”,而是“算得稳、可重来”。
八、监控:差异本身也要被监控
实时和离线的差异,不能等用户发现,要自己监控:
- 同一指标、同一区间,实时结果和离线结果的差异率;
- 差异率的趋势,突然变大要告警;
- 差异集中在哪些维度、哪些单,要能下钻。
监控差异的好处是:既能发现实时链路的漏数,也能发现离线链路的错算。
九、常见坑
- 用实时数字做结算:数据没到齐,结算金额反复变;
- 用离线数字判断异常:T+1 的报表看不出“现在挂了”;
- 实时和离线各写一套口径:两个数字永远对不上;
- 实时只增不减:退款、取消后数字虚高;
- 按到达时间统计:乱序导致数据落错窗口;
- 消息重复没有去重:同一单被算多次;
- 补数不幂等:补一次多一批;
- 离线任务没有依赖校验:上游没完成就跑下游,产出空数据;
- 差异不监控:等用户来问“为什么两个数不一样”;
- 实时看板不标注延迟:用户以为是最终数字。
十、结语
实时和离线不是二选一,而是分工:
- 实时负责“快”,用来发现异常、辅助决策;
- 离线负责“准”,用来结算、考核、对外承诺。
设计的关键不是把两者做成一样,而是让它们共用一套定义、各自执行、差异可解释。