干货 | 携程中转交通方案拼接性能优化

作者简介

简言,携程后端开发经理 ,关注技术架构、性能优化、交通规划等领域。

一、背景介绍

由于交通规划和运力资源的限制,用户查询的两地之间可能没有直达交通,或者在重大节假日时,直达交通都已售罄。不过,通过火车、飞机、汽车、船舶等两程或多程中转的方式,用户仍然可以到达目的地。此外,中转交通有时在价格和耗时方面更具有优势。例如,对于从上海到运城,通过火车中转可能比直达火车更加快捷和便宜。

fab0aec6c24b1944efffdc1d6ee21570.png

图1 携程火车中转交通列表

在提供中转交通方案时,很重要的一个环节是将两程或多程的火车、飞机、汽车、船舶等拼接起来组成可行的中转方案。而中转交通拼接的第一个难点是拼接空间极大,仅考虑上海做中转城市,就可以产生近亿种组合;另一个难点在于对实时性有要求,因为产线数据随时变化,需要不断地查询火车、飞机、汽车、船舶的数据。中转交通拼接需要大量的计算资源和IO开销,因此,对其性能进行优化显得尤为重要。

本文将结合实例,介绍在中转交通拼接性能优化过程中所遵循的原则、分析和优化方法,旨在为读者提供有价值的参考和启示。

二、优化原则

性能优化需要在满足业务需求的前提下,在各种资源和约束条件下去平衡和取舍,遵循一些大的原则有助于消除不确定性,去逼近解决问题的最优解。具体来说,中转交通拼接优化过程中主要遵循以下三个原则:

2.1 性能优化是手段而不是目的

虽然本文是关于性能优化的,但仍需要在最开始强调:不要为了优化而优化。满足业务需求的方式有很多,性能优化只是其中一种。有时候问题非常复杂,限制也很多,在不显著影响用户体验的前提下,通过放宽限制或采用其他流程来减少对用户的影响,这也是解决性能问题的好方法。在软件开发中,存在许多通过牺牲少量性能来实现大幅降低成本的事例。例如,在Redis中用于基数统计(去重)的HyperLogLog算法,它在标准误差为0.81%的前提下,只需要12K空间就能够统计264的数据。

回到问题本身,由于需要频繁地查询产线数据,并且进行海量的拼接操作,那么如果要求每个用户查询时都立刻返回最新鲜的中转方案,成本将会非常高。为了降低成本,需要在响应时间和数据新鲜度之间进行平衡。经过仔细考虑选择可以接受分钟级的数据不一致,对于一些冷门线路和日期,可能在首次查询时没有好的中转方案,此时引导用户重新刷新页面即可。

2.2 不正确的优化是万恶之源

Donald Knuth在《Structured Programming With Go To Statements》中提到:“程序员们浪费大量的时间去思考、担忧非关键路径的性能,而尝试优化这部分性能,对整体代码的调试和维护都有非常严重的负面影响,因此97%的情况,我们应该忘记小的优化点”。简而言之,在没有发现真正的性能问题之前,在代码层面过度炫技式的优化,不仅不会提高性能,反而可能会导致更多的错误。然而作者同样也强调:“对于剩下关键的3%,我们也不要错过优化的机会”。因此,需要时刻关注性能问题,不做会影响性能的决策,并在必要的时候做正确的优化。

2.3 量化分析性能,明确优化方向

正如前一节所述,在进行优化之前,首先要量化性能并找出瓶颈,这样优化的才更有针对性。量化分析性能可以借助耗时监控、Profiler性能分析工具、Benchmark基准测试工具等,重点关注耗时特别长或者执行频率特别高的地方。正如阿姆达尔定律所述:“系统中对某一部件采用更快执行方式所能获得的系统性能改进程度,取决于这种执行方式被使用的频率,或所占总执行时间的比例”。

此外,还需要注意到性能优化是一场持久战。随着业务的不断发展,架构和代码也不停地变化,因此更需要持续量化性能,不断分析瓶颈和评估优化效果。

三、性能分析之路

3.1 梳理业务流程

在性能分析之前,首先要梳理业务流程。中转交通方案拼接主要包含以下四个步骤:

a.  加载线路图,如北京经南京中转到上海,只考虑线路本身的信息,与具体的班次无关;

b.  查火车、飞机、汽车、船舶的产线数据,包括出发时间、到达时间、出发站、到达站、价格和余票信息等;

c.  拼接出所有可行的中转交通方案,主要是考虑换乘时间不能过短,以免无法完成换乘;同时也不宜过长,以免等待太久。拼接出可行的方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值