知识卡片

用模板语言隔离业务解析逻辑,应对大规模异构数据源适配

普通读书笔记卡

内容

电商垂直搜索需要适配四十几家不同源站各自不同的页面结构来提取商品信息,团队最初的做法是在代码里写一堆if/else分支来区分不同站点,但多人协作开发时这种写法极易在合并代码时产生大量冲突;后来尝试插件式编程,动态加载模块看起来更优雅,但插件运行时会污染整体代码运行环境,长期运行后容易冒出莫名其妙的Bug。最终采用的方案是基于模板语言:把每个源站的解析业务逻辑单独封装进一个模板文件,让业务代码和它要解析的HTML结构放在一起、方便调试,同时这个模板文件本身的运行环境是被隔离的,即使某个源站的解析逻辑出了问题,也不会污染到其他源站的代码,代价是需要额外投入开发一套配套的模板编写调试工具。这个演进给出一条通用启示:应对”同一套系统需要适配大量彼此独立、还会各自频繁变化的外部数据源”这类问题,与其把差异逻辑硬编码进主干代码(难合并)或做成动态加载的插件(隔离性不足、易污染主环境),不如把每份差异逻辑收纳进一个独立、运行环境天然隔离的载体(模板文件),用隔离性换取并行开发效率和故障不扩散的稳定性。

参考来源

- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.12 基于Xapian的垂直搜索引擎的构建分析"节,"6.12.4 垂直搜索技术和业务细节","2.如何应对不同众多异构数据模型"(源文件:_epub-src/OEBPS/Text/Chapter6_12_5.xhtml) - 结论依据:原文说明"一开始的做法是在代码里做各种if/else……在团队多人共同开发时,将给合并代码和解决冲突带来很大的工作量。后来采用插件式编程……但是会污染代码运行环境……后来,我们采取了基于模板语言的方法,把业务逻辑封装到一个模板文件……业务代码的运行环境被隔离在模板范围内,即使出了问题也不会污染到其他代码",直接支撑本卡片结论。 - 原始内容:一开始的做法是在代码里做各种if/else,但在团队多人共同开发时,将给合并代码和解决冲突带来很大的工作量。后来采用插件式编程……但是会污染代码运行环境……后来,我们采取了基于模板语言的方法,把业务逻辑封装到一个模板文件……业务代码的运行环境被隔离在模板范围内,即使出了问题也不会污染到其他代码。