实时统计与离线统计:延迟和成本的取舍

chihqiang chihqiang 2026-11-14 约 6 分钟 2372 字

老板要“实时”,财务要“准确”,这两件事往往不是同一条链路能同时满足的

统计平台做到一定阶段,一定会遇到这个问题:

  • 运营说:我想看今天到现在为止的下单量,刷新就能看到;
  • 财务说:我要的是最终确认的数,退款、取消都要扣掉;
  • 老板说:为什么日报和实时看板的数字不一样?

这三个需求,指向的是两种统计方式:实时统计和离线统计。

它们不是“谁替代谁”的关系,而是各有各的适用场景。设计统计平台,很重要的一件事就是把两者分清楚,并且让它们的差异可解释。


一、三种时效

实际业务里,统计的时效通常分三档:

时效延迟典型场景典型指标
实时秒级到分钟级大促监控、异常告警、运营值守当前下单量、支付量、失败率
准实时几分钟到一小时小时级经营看板小时趋势、渠道对比
离线小时级到天级日报、月报、财务结算营收、完成率、结算金额

三档不是技术炫技,而是成本和确定性的取舍:

  • 越实时,链路越长、成本越高、越容易受乱序和重试影响;
  • 越离线,数据越稳定、越容易重算,但时效性差。

二、实时统计适合什么

实时统计的价值,是让问题尽早暴露:

  • 大促期间下单量突然掉零;
  • 某个渠道支付成功率骤降;
  • 某类商品退款率异常升高。

这类场景要的是“快”,不是“精确到分”。所以实时统计通常只看过程指标:

  • 当前下单量、支付量;
  • 当前转化率、失败率;
  • 当前各渠道占比。

实时统计不适合直接对外承诺最终数字,因为它有两个天然缺陷:

  1. 数据可能还没到齐:消息延迟、重试、乱序,都会让数字短暂偏低或偏高;
  2. 状态可能还会变:刚下的单可能取消,刚支付的单可能退款。

所以实时数字更适合“看趋势、看异常”,而不是“做结算、做考核”。


三、离线统计适合什么

离线统计的价值,是给一个确定的答案:

  • 昨天到底成交了多少;
  • 这个月营收是多少;
  • 退款、取消、坏账都扣完之后,利润是多少。

离线统计的优势:

  • 数据完整:等所有变更都落定再算;
  • 可重算:口径变了、数据错了,可以按区间重跑;
  • 可对账:和财务、渠道账单对得上。

代价是时效:T+1 是常态,能做到小时级已经不错。


四、为什么实时和离线的数字会不一样

这是统计平台最常被问的问题,也是设计时就要想清楚的。

差异通常来自四个地方:

第一,数据没到齐。 实时链路里,一条变更从产生到可查,有延迟;离线统计等所有数据到齐才算。

第二,状态还没定。 实时把“刚支付”算成成交,离线会把后面退款的单扣掉。

第三,时间口径不同。 实时按“事件发生时间”算,离线按“业务确认时间”算。

第四,去重方式不同。 实时为了快,可能用近似去重;离线可以精确去重。

这些差异本身不是 bug,但必须可解释。如果用户问“为什么差 3%”,平台要能回答:差在哪些单、差在哪个环节。

做不到可解释,实时和离线就会变成两个互相打架的数字。


五、两种统计怎么共存

比较稳妥的做法是:一份定义,两套执行,差异可查。

  • 定义只有一份:指标的名称、口径、时间字段、过滤条件,实时和离线共用;
  • 执行可以两套:实时走流式链路,离线走批量链路;
  • 差异可查:同一区间,实时结果和离线结果要能对比,差异要能定位到单。

在这个基础上,再约定使用边界:

  • 实时看板只展示过程指标,并标注“数据可能有延迟”;
  • 日报、月报、结算使用离线结果;
  • 需要对外承诺的数字,一律以离线为准。

这样用户就不会拿实时数字去对财务账,也不会拿离线数字去判断“现在有没有异常”。


六、实时统计的设计要点

实时链路比离线链路脆弱,设计时要重点处理五件事:

窗口。 统计“最近 5 分钟”“今天到现在”,窗口边界要统一,不能每个页面自己算。

去重。 消息可能重复,同一单可能被算多次;要用单据标识去重,而不是简单累加。

乱序。 事件到达顺序可能和发生顺序不一致,尤其是跨表变更;需要按事件时间处理,而不是到达时间。

回撤。 已统计的数据可能被修正(取消、退款),实时结果要支持“减回去”,不能只增不减。

幂等。 重试、重放、补偿都可能重复执行,写入必须幂等。

这五点里,任何一点没做好,实时数字都会“看起来在动,但不可信”。


七、离线统计的设计要点

离线链路相对稳定,但也不是“跑个任务就行”:

  • 分区:按天或按小时分区,便于重算和回溯;
  • 补数:支持按区间重跑,补数必须幂等;
  • 依赖:任务之间有依赖关系,上游没完成不能跑下游;
  • 重算:口径变更、数据修复后,要能指定区间重算,而不是全量重跑;
  • 校验:每个任务产出后做基本校验(行数、金额、空值),异常要阻断下游。

离线统计的核心不是“算得快”,而是“算得稳、可重来”。


八、监控:差异本身也要被监控

实时和离线的差异,不能等用户发现,要自己监控:

  • 同一指标、同一区间,实时结果和离线结果的差异率;
  • 差异率的趋势,突然变大要告警;
  • 差异集中在哪些维度、哪些单,要能下钻。

监控差异的好处是:既能发现实时链路的漏数,也能发现离线链路的错算。


九、常见坑

  1. 用实时数字做结算:数据没到齐,结算金额反复变;
  2. 用离线数字判断异常:T+1 的报表看不出“现在挂了”;
  3. 实时和离线各写一套口径:两个数字永远对不上;
  4. 实时只增不减:退款、取消后数字虚高;
  5. 按到达时间统计:乱序导致数据落错窗口;
  6. 消息重复没有去重:同一单被算多次;
  7. 补数不幂等:补一次多一批;
  8. 离线任务没有依赖校验:上游没完成就跑下游,产出空数据;
  9. 差异不监控:等用户来问“为什么两个数不一样”;
  10. 实时看板不标注延迟:用户以为是最终数字。

十、结语

实时和离线不是二选一,而是分工:

  • 实时负责“快”,用来发现异常、辅助决策;
  • 离线负责“准”,用来结算、考核、对外承诺。

设计的关键不是把两者做成一样,而是让它们共用一套定义、各自执行、差异可解释。

分享: Twitter Facebook
chihqiang

chihqiang

代码与生活的点滴记录