追求卓越
打造极致文化与产品研发结合的最佳实践
神策已启动「卓越产品计划」
产品功能、性能、稳定性不断迈向新台阶
给客户带来价值,价值源于对产品的不断打磨。对神策分析的性能进行持续优化一直是我们的工作重点,一方面可以显著提升产品使用体验,另一方面能够为客户降低硬件成本以承载系统运行。
本文将结合具体业务场景,详细解读神策分析的五重性能优化。
第一,批量导入性能优化
神策将数据分区分为三层,第一层是 Project_id,代表用户项目;第二层是 Day_id,代表日期,第三层是 EventBucket(默认为 10 个,可自主配置),代表数据对应事件的分桶。
通常情况下,批量导入会涉及多个项目、多个日期的多个事件,同一个项目、同一天的同一个事件桶数据应该输出到同一个文件,在保证文件质量的基础上,导入性能优化核心要解决两个问题:第一,避免数据倾斜;第二,尽可能提高并行度。针对此,神策从以下四个维度进行了导入性能优化:
● 跟三层分区保持一致,使用三元组(Project_id, Day_id, EventBucket)进行数据 shuffle,以保证一个分区下的数据文件数最少
● 在优化方案中引入递增的 slice,解决三元组可能引起的数据倾斜问题
● 提出数据分布预估的导入策略,包括后置预估和前置预估
● 设计流水线提交方案,避免前置预估计算带来的额外开销
在后续的文章中我们将详细介绍批量导入性能优化,此处不做赘述。
第二,智能聚合表优化
有别于传统的数据仓库建设,神策分析在数据流处理过程中,基本省去了复杂的 ETL 流程和传统数据仓库的分层建设思路,用户可以直接基于事件表 + 用户表 + Item 表模型进行数据分析,采用通用分析模型的方式,快速计算出自己想要的指标和结果。这种设计大大降低了用户的理解和使用成本,但对于相同或者相似维度的指标,往往需要基于原始表模型进行重复计算。
智能聚合表优化的基本思路是基于用户实际查询,针对高频指标和维度,智能构建出中间服务层数据模型,在后续查询时基于中间表的方式进行计算,从而避免所有指标都要基于原始表所带来的高计算成本。当然,在实际执行智能聚合表优化的过程中,我们也碰到了一系列的技术挑战。比如,高频维度和指标的选取需要综合考虑指标的计算成本、聚合表的压缩率、聚合表本身的计算成本等因素。
另外,由于高基数维度的存在,聚合表往往达不到很好的压缩效果,对此我们结合实际业务特点,有针对性地采取热门维度值截取、时间或者数据类型分桶、BitMap 存储压缩等方式,将高基数维度降低为低基数维度,大大提高了聚合表的压缩效果。
第三,数据重组织查询优化
查询执行,是检验系统是否健壮的试金石,面对后端存储的海量数据,只有查询引擎足够强大,才能保证前端的实时查询平稳运行。在我们针对神策分析开发的一系列基于数据组织的性能优化中,shuffle merge 是重要的一项。shuffle merge 充分利用了底层数据的有序性,变全排序为归并排序,跳过耗时的 sort 算子,极大地降低了排序的时间复杂度,加速了计算进程。
在进行数据重组织查询优化过程中,针对以下两个问题我们可以提出针对性优化方案:
● 对于数据量较大的客户,其分区内文件数量较多,再加上客户数据或延迟上报,会进一步增加单分区内的文件数量。针对此,我们设计了虚拟分桶采样组,在数据重组织时,尽量将同一采样组的数据组织到同一文件中
● 对于慢文件拖慢整体进度、shuffle merge 的归并在数据规整后没有有效利用采样组以提升并行度这两个难题,我们提出了 merge all 的方案,将归并从 union 算子下移到 scan 阶段,直接桶对桶(采样组对采样组)做归并
关于数据重组织查询优化的更多细节实践,将在下一篇文章中详细展开。
第四,查询去重优化
查询去重是针对高并发场景下的查询优化。在实际业务场景中,我们发现用户在高峰期发起的大量查询中,会包含部分相同的指标内容,如果将这种并行查询全部下发到查询引擎中容易导致查询资源整体紧张。因此,我们引入了针对查询的全局去重机制,对并发场景下的重复查询进行排队管理。针对每一个查询类型,生成一个查询条件签名作为全局锁,相同的查询条件要先获得全局锁,然后才能真正执行查询。当相同的全局锁已经被同一个查询条件占用时,后续的查询会等待锁的释放,当第一个查询执行成功之后会将查询结果写入到缓存系统,后续即使获得了全局锁的查询也可以直接从缓存系统中获取到查询结果,从而避免了大量重复查询在同一时间段的拥挤。
查询去重优化能够有效缓解和优化高峰场景下的并发查询,也在一定程度上提高了系统整体的健壮性。
第五,页面首次首屏加载时间优化
优化页面加载速度、持续提升用户体验是我们对产品性能的另一种优化。
首先,通过线上数据分析和线下性能诊断,定位性能瓶颈并制定可行的解决方案,沉淀出通用的性能分析平台,便于我们通过数据对页面性能进行多维度诊断。通过线上线下对页面性能的分析,我们针对性能分析阶段发现的问题,如资源体积大导致加载过慢、资源请求过多导致加载阻塞、资源和请求的时序问题导致首屏渲染的较慢等,采取了多种优化手段,包括:
● 同步渲染机制,在 HTML 初始化的时候,同步返回首屏所需的异步数据,避免发送多次异步请求
● 非首屏的模块异步加载
● 调整静态资源和异步请求的请求时序,减少阻塞
● 减少非必要的异步请求
● 建议有条件的客户开启 GZIP 压缩和 HTTP2 协议等
通过多轮性能优化,客户页面首屏时间平均下降 30%,用户体验得到了很大提升。
以上性能优化实践已经在部分客户环境中得到了效果验证。下图是某客户环境上线相关优化后的概览平均查询时间,已经从高峰期的 24s 逐步降低至目前的 12s 左右。
图 模拟数据
虽然性能优化已经取得了阶段性的成果,但是「卓越产品计划」仍在继续,我们也将会在以下几个重点方向持续投入:在“应用化”重构和容器化方向,继续完善分离集群部署的架构,完善 SaaS 化多租户能力、完善多种部署模式下的架构统一;在智能聚合表方向,提供更加标准化的聚合表产品能力,更加智能聚合表构建方式、基于物化视图的数据一致性中间表和中间表动态管理能力等。此外,我们还会在产品能力上加强对于业务资源治理能力的支持,提供统一的资源管理中台和集中式的业务集市中间表管理能力。
关注神策数据公众号,了解更多产品技术解读。