如何设计一个“后”报表功能

AI摘要
这是一个关于高并发在线订单系统实时统计报表架构设计的【问题提问】。提问者描述了现有基于定时任务批量统计方案在数据量增大时性能不足、延迟高的问题,以及早期队列方案引入的复杂性和数据重复消费顾虑。核心诉求是在不影响主订单业务的前提下,设计一个能处理多数据源、支持复杂业务逻辑、兼顾实时性与可靠性的统计汇总方案。

1. 运行环境

LNMP

1). 当前使用的 Laravel 版本?

Laravel 12
//: <> (使用 php artisan --version 命令查看)

2). 当前使用的 php/php-fpm 版本?

PHP 版本:PHP 8.4

php-fpm 版本: 8.4

3). 当前系统

Linux

4). 业务环境

5). 相关软件版本

2. 问题描述?

系统可以看成一个 在线订单 系统,每天针对里面的每笔订单,都需要进行一定的逻辑统计。比如说把归属于北京地址的,计入到日订单统计表A里北京列+1,把安徽的计入到安徽列+1.把客客单价>500的计到日客单价统计表B里 VIP 列,并且累加金额,把客户价 > 2000 的,统计到 SVIP 列,并且累加金额。
当然,实际的逻辑肯定不会这么简单。

3. 您期望得到的结果?

希望可以在不影响订单系统的前提下,对这些订单进行统计,汇总到报表中。因统计量比较大,且逻辑比较复杂,不适合直接通过SQL得到。只能通过程序逻辑计算后写入到某个数据库的表格中。
之前采用过队列,订单系统只放入队列,影响比较小。报表应用从队列取订单数据来进行后续的流程,一笔笔订单处理而不是每隔一段时间重新统计本天的。
但这样引入了一个队列子系统,增加了不确定性。
并且一笔订单并不是只统计或者说消费一次,一笔订单可能在地区统计中统计一次,在客单价统计中又统计一次。
要监听的也不止订单一个数据来源,还会有货物的处理等不同数据源。

4. 您实际得到的结果?

原始的设计思路是保障订单系统的运行,因此脱离了订单处理体系,使用计划任务,每隔一段时间统计一下,更新到报表里。
报表可以容许一小段时间的延迟,但如果能实时则最好不过了。
报表是按日统计的,为了简便都是查出来本日的,直接统计计算生成表,删除本日历史数据然后直接插入。
这样一来,早上的订单会被纳入统计非常多次。因业务高峰发生在下午4点左右,而此时有前面15个小时的数据,数据量又比较大,所以统计出来比较慢。

各位有更好的方案吗,要如何设计呢?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3

每天晚上跑定时任务

2周前 评论

根据有变更的订单写入一张任务处理表,再起一个定时任务每隔一段时间去扫描查询需要更新的订单生成新报表。如果订单任务还没有扫到订单再次发生变更则删除原记录重新写入。生成报表后做一个标记。保证一个订单在任务表有且只有一条未处理的数据。

2周前 评论
  • 实时数据:业务后置行为做异步埋点上报,在异步任务里处理数据(有要求的话,可以每天与源数据表进行数据核对校正)
  • 非实时数据:计划任务

做各类报表的前提是先洗好相关基础业务数据表,然后汇总对应报表。 步骤:源数据表->业务基础数据表->业务报表,基础数据表来源于源数据表,报表来源于基础数据表,基础数据表可以根据不同业务维度设计多张表,基础数据表和业务报表业务脚本支持重写覆盖,以便于修正数据用。

2周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!