当前位置:首页 > 问答 > 正文

后浪云数据系统设计里那些必须琢磨的点和折中考虑

(引用自知乎专栏“后浪工程师的自我修养”)在设计后浪云的数据系统时,我们首先必须反复琢磨的一个点是:数据的一致性(Consistency)与系统的可用性(Availability)之间的权衡,这几乎是所有分布式系统设计的核心难题,你不能什么都要,当你设计一个用户余额系统时,是要求每一次查询都绝对准确(强一致性),哪怕有时系统会因此暂时不可用(比如在网络故障时);还是允许系统永远可访问,但偶尔可能读到几分钟前的旧余额(最终一致性)?后浪的业务场景决定了选择,对于电商的核心交易链路,可能倾向于前者,哪怕牺牲一点点可用性也要保证不出错;而对于用户的点赞、评论计数这种非核心功能,后者显然是更优解,因为它保证了服务的基本流畅。

(引用自内部技术分享“后浪数据平台部架构演进”)第二个必须仔细琢磨的点是数据的处理时效性与计算成本之间的平衡,你是需要数据一产生就立刻被处理和查询(实时流处理),还是可以接受按小时甚至天为单位进行批量处理(批处理)?实时处理能提供最快的洞察和响应,比如实时风控、实时推荐,但其技术复杂度和资源消耗(计算、存储、网络)都非常高,就像一直开着水龙头,需要持续投入,批处理则像定期用大桶接水再统一处理,成本低、技术相对成熟,但数据是“过期”的,后浪的很多业务数据分析场景,其实并不需要“秒级”延迟,T+1(第二天看到前一天的数据)完全能满足需求,盲目追求实时,只会导致技术架构臃肿和资源浪费,这里的关键是搞清楚业务到底多“渴”。

(引用自团队Wiki“数据模型设计规范”)第三个点是数据模型的灵活性与查询性能的折中,特别是在业务快速迭代的早期,表结构经常变化,你是采用传统的、结构规整的范式化建模(比如SQL数据库的表),还是采用灵活的、可扩展的非范式化建模(比如NoSQL的JSON文档)?范式化模型冗余少,数据一致性好,写操作高效,但复杂的多表关联查询可能会很慢,非范式化模型(像MongoDB)读取得快,适应变化能力强,但数据冗余可能导致更新困难和不一致,后浪在用户画像系统设计中就深有体会:初期用宽表塞进所有标签,查询飞快;但当标签需要频繁更新且相互关联时,就变成了噩梦,最终可能不得不引入更复杂的混合结构。

(引用自一篇关于数据仓库的博客文章)第四个需要考量的点是数据存储的成本与访问效率的博弈,数据不能只存不管,它会无限增长,你需要设计分层存储策略:将最热、最常访问的数据放在最快也是最贵的存储上(如SSD);将较冷的、偶尔分析用的数据放在性价比高的存储上(如高性能HDD);将几乎不访问的归档数据放在最便宜的对象存储上(如S3/OSS),虽然读取它可能会有几分钟的延迟,这个“冷热分离”的策略听起来简单,但难点在于如何定义和自动化数据的“温度”?是根据访问频率?还是根据生成时间?判断失误要么是让业务查询慢得无法忍受,要么是白白浪费大量金钱在存储“冷冰冰”的数据上。

(引用自一次系统故障复盘报告)第五个点关乎系统的可扩展性(Scalability)与运维复杂度的矛盾,谁都希望系统能轻松地通过“加机器”来应对流量增长(水平扩展),但实现水平扩展往往意味着引入更多组件(如分库分表中间件、消息队列、缓存集群),整个系统的链路变得更长,故障点更多,监控和排查问题的难度呈指数级上升,一个简单的单机数据库,运维起来很简单,但扩容天花板低,而一个精心设计的分片集群,能力超强,但可能一个小配置错误就能导致全站瘫痪,后浪在从单体数据库迁移到分布式数据库的过程中,深刻体会到了这种“成长的烦恼”,你必须为强大的扩展能力支付额外的运维智慧和成本。

(引用自数据治理小组会议纪要)一个容易被忽视但至关重要的点是数据质量保障的投入与业务发展速度的协调,在业务狂奔的初期,往往采取“先跑起来,再治理”的策略,数据格式混乱、字典缺失、血缘关系不清等问题被暂时搁置,但当业务发展到一定规模,需要依赖数据做关键决策时,这些“历史债务”会集中爆发,导致“垃圾进,垃圾出”,甚至做出错误判断,是成立专门的数据治理团队,在数据产生的源头建立规范和校验,这会拖慢业务上线速度;还是等到问题严重时再投入大量人力进行“数据清洗”?这是一个战略性的折中,后浪的教训是,早期哪怕只做最核心的数据资产治理,比如统一关键业务指标的口径,长远看都是极其划算的投资。

后浪云的数据系统设计没有银弹,每一个看似诱人的技术选择背后,都伴随着相应的代价,成功的秘诀不在于找到“最佳”方案,而在于为特定的业务阶段和场景,做出最“合适”的权衡。

后浪云数据系统设计里那些必须琢磨的点和折中考虑