yzc888亚洲城

性能优化模式(6)——避免蚊子大炮模式

“用大炮打蚊子”本来是大材小用的意思,但是细致想一想,用大炮打蚊子,成功率不高。对于开发工程师而言,一方面为了快速承接业务,按照方案复用原则,总是尽可能地利用现有系统,这使得系统功能越来越强大;另一方面,提高系统的通用性或可重用性也是工程师们在设计系统的一个重要目标。随着这两个过程的相互独立演化,采用通用方案解决特定问题的现象随处可见,形象地说,这就像大炮打蚊子。大炮成本很高,蚊子的数量众多,最终的结局往往是蚊子战胜了大炮。

“避免蚊子大炮模式”是经济原则在运行时系统的运用,它要求采用最节省资源(CPU、内存等)的方法来解决所面临的问题,资源浪费会带来未来潜在的风险。工程师接到一个需求的时候,需要思考的不仅仅是如何复用现有的系统,减少开发时间,还需要考虑现有系统为处理每个新需求访问所需运行时成本,以及新需求的预期访问量。否则,不加辨别地利用现有系统,不仅仅增大了重构风险,还有可能交叉影响,对现有系统所支持的服务造成影响。从另外一个角度讲,工程师在构建一个可重用系统的时候,要明确其所不能解决和不建议解决的问题,而对于不建议解决的问题,在文档中标明潜在的风险。

我们的挑战是为移动用户寻找其所在位置附近的商家信息。美团有非常完善的搜索系统,也有资深的搜索工程师,所以一个系统需要查找附近的商家的时候,往往第一方案就是调用搜索服务。但是在美团,太多的服务有基于LBS的查询需求,导致搜索请求量直线上升,这本来不属于搜索的主营业务,在一段时间里面反倒成了搜索的最多请求来源。而搜索引擎在如何从几十万商家里面找最近的几百商家方面的性能非常差,因此一段时间里,搜索服务频繁报警。不仅仅搜索服务可用性受到了影响,所有依赖于LBS的服务的可用性都大大降低。

在对系统分析之后,我们认为更适合解决最短直线距离的算法应该是k-d tree,在快速实现了基于k-d tree的LBS Search解决方案之后,我们用4台服务器轻松解决了30多台搜索服务器无法解决的问题,平均响应时间从高峰时的100ms降低到300ns,性能取得了几百倍的提高。

避免蚊子大炮模式的问题和数据局部性模式类似,都与最小可用原则相冲突。在系统设计初级阶段,寻求最优方案往往意味着过度设计,整个项目在时间和成本变得不可控,而为每个问题去找最优秀的解决方案是不现实的奢求。最优化原则的要求是全面的,不仅仅要考虑的运行时资源,还需要考虑工程师资源和时间成本等,而这些点往往相互矛盾。在如下情况下,避免蚊子大炮模式所带来的好处有限:在可预见的未来,某个业务请求量非常小,这时候花大量精力去找最优技术方案效果不明显。

在设计阶段,避免蚊子大炮模式是一个需要工程师去权衡的选择,需要在开发成本和系统运行成本之间保持一个平衡点。当很多功能融入到一个通用系统里而出现性能问题的时候,要拆分出来每一个功能点所造成的影响也不是件轻易的事情,所以采用分开部署而共用代码库的原则可以快速定位问题,然后有针对性地解决“蚊子大炮”问题。总的来说,在设计阶段,避免蚊子大炮模式是工程师们进行分析和设计的一个重要准则,工程师可以暂时不解决潜在的问题,但是一定要清楚潜在的危害。构建可重用系统或方案,一定要明确其所不能解决和不建议解决的问题,避免过度使用。

性能优化模式(6)——避免蚊子大炮模式