美团酒店直连项目自2013年末开始,通过业务上的不断完善和技术上的不断改进,至今已经接入200多家供应商,其中在线酒店3万以上,在线SPU30万以上。经过两年的成长,美团酒店直连平台终于在2015年末发展为国内最大的酒店直连业务平台,其接入的业务类型也从最初的经济连锁,拓展到高星渠道、小连锁集团、非标准住宿等,获得了业界一致好评。
随着美团点评的日益壮大,客户的需求和系统体量的不断增加,直连平台的技术架构和数据应用面临着诸多挑战。为了保障美团点评的用户体验度,对技术方面会提出更高的要求。
这些是直连平台每天都在思考的问题。技术平台和数据应用的改进完善并非一蹴而就。考虑到数据是业务运营的核心,这里先以产品数据一致性问题的解决方案作为切入点与大家分享,也希望借此抛砖引玉,欢迎更多的同学一起探讨,共同进步。
为了使数据一致性完善方案更直观易懂,这里引用美团酒店直连项目中直连平台与供应商酒店产品数据一致性方案作为分析案例,通过面临问题、总体思路、解决方案和总结思考四个方面进行论述。
酒店直连系统的主要工作是将供应商的酒店产品(房型),通过系统对接的方式,转化为美大点评平台可以售卖的产品(房型)。
酒店产品购买是一个可预订日期跨度比较长的业务。以美团App为例,可以预订60天内的酒店。
因此我们的系统需要将供应商全部酒店全部房型信息以及60天内的价格、库存、售卖取消规则等信息,获取到我方,落地后形成产品数据,一则用在C端给用户进行展示,二则参与交易环节。
下图为产品供给流向图:
问题:直连系统在上单流程中如何保证产品缓存与供应商系统的数据一致性?
上述面临的情况很像数据库的主从同步问题,那我们是不是可以借鉴主从同步的方式来解决该问题呢?我们来看一下MySQL主从备份的实现细节:
MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另2个在从服务器上)。当开始同步时,从服务器开始创建一个I/O线程,以连接主服务器,并且让主服务器发送在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。 该线程即为主服务器上show processlist输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容,并将该数据复制到从服务器数据目录中的本地文件(即中继日志)中。 第3个线程是SQL线程,由从服务器创建,用于读取中继日志并执行日志中包含的更新。 在从服务器上,读取和执行更新语句被分成两个独立的任务。当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容。
如下图:
以上的数据同步方案广泛的运用在数据库的数据一致性问题上,而这也正是我们长久以来一直寻求的解决之道。
具体对应到我们的系统,美团直连平台和供应商的关系为:在供应商数据产生变化的时候,将变化的部分推送至直连平台。
听上去这是个很不错的方式,但这只是个美好的目标。诸多摆在我们面前的问题无法忽略:供应商的支持力度低、供应商网络稳定性差、供应商系统可用性差。
大思路有了,但是还有很多具体问题,接下来我们就来说说是怎么解决的。
直连产品数据一致性的演进大致可以分为四个阶段,按照落实的时间顺序具体的解决方案是:
前期合作的供应商经济连锁集团大都有一个特点,他们会提供一套标准的API给有合作意向的OTA进行开发,供应商不会对API进行任何逻辑上的修改。
因此,初期我们选取的产品数据同步方案为:从无到有,定时拉取供应商全量产品数据。
应用前提:数据量级不大,数据传输效率高,拉取耗时可控。
方案优点:开发周期短,逻辑简单,串行拉取。
方案缺点:可持续性差,异常恢复成本高,对网络传输的带宽和本地存储容量要求高。
案例分析:直连平台每30分钟主动拉取供应商下的全部酒店下全部房型信息以及60天内的价格,库存,售卖取消规则等信息。
如下图:
我们使用这个方案在同几家供应商进行合作了以后,陆续发现存在一些问题:
获取信息数据量庞大
假设一家中等规模的供应商有1000家酒店,每个酒店下面有10个房型。
获取信息数据量=1000(酒店)×10(房型)×60(天数)=60W
供应商接口速度很慢
供应商接口速度很慢 根据统计,供应商接口的平均响应时间在两三秒以上,获取产品接口由于数据量大,可能响应时间在几十秒甚至上百秒。
这时你可能会问:目前定时任务是每30分钟调起一次,缩短定时任务的调起时间就可以减少数据不一致问题的时间段呢?
这确实可以解决一部分问题,提前是任务在短时间就可以执行完成。但是对于长时间执行无法完成的任务可能适得其反,过于频繁的接口调用,反到把供应商的系统压垮了。
这是我们不愿意看到的,慢总比不能使用来得好些。
随着业务量的增大,数据不断激增,全量数据拉取的缺点将被不断放大,实效上无法保障业务对数据一致性的要求。此时,只有主动求变才能有效应对,这里我们采取的方案是:分而治之,结合实际分析拉取部分数据。
应用前提:充分调研,因地制宜,数据可分段获取。
方案优点:同步数据体量大幅降低,数据准确度有效提升。
方案缺点:还存在数据不一致的时间差。
案例分析:根据酒店的预订特点,调研了美团用户的消费习惯:95%以上的用户都在预订10天内的酒店产品。
我们将产品拉取方式调整了两种:
固定时间点(例:1点,7点,13点,20点)拉取全量60天的酒店产品数据。
每15分钟拉取10天的酒店产品数据(这就好比我们在查询数据库的时候添加了limit)。
同时调整拉取规则,拉取任务没有执行完成,不再重复调起,以减少对供应商系统的压力。
如下图:
上述方案我们可以简单的认为将拉取的数据量和响应时间减少了近5/6,同时我们可以根据供应商的服务能力动态调整拉取频率,例如:2分钟可以执行完的任务,设置为每3分钟拉取一次。
即使因为网络抖动等原因引起的任务时间增加,也不用担心任务重复调起压垮供应商系统。
经过第二阶段,流程演进为:
综上,我们基本实现了不间断的拉取产品数据,同时是用户高频进行购买的产品,产品数据不一致性得大了很大幅度的缓解。
拉取部分产品数据的方案解决了绝大多数的产品数据不一致的问题,但是在2次拉取数据的间隔时间差内还会存在不一致的问题,会导致用户在支付之后没有预订到心仪的房型而自动退款,如选择退回原支付方账户,用户需要等待3~10个工作日,体验十分不好。
我们迫切需要改进该问题,提高用户体验。 对于“分而治之”方案的缺憾我们进一步思考,寻找到了解决的方案。
为了应对间隔时间差的问题,我们的解决的方案是:提前为用户准备热点数据。这个主要是靠触发式更新(被动)与库存预测(主动)来实现。
应用前提:摸清定位,准确匹配,对系统本身有深入的了解,同时对业务未来的发展趋势有一定的预测能力。
方案优点:数据准确度提高,降低数据一致性相关的资源消耗。
方案缺点:分析成本高,增加了分析数据捕获清洗的系统消耗。
案例分析:基于用户的访问行为情况,提前对产品进行数据更新,为用户准备好即将可能要购买的产品。
我们从预订流程入手,对原有的预订流程进行分析。
原有流程很简单,如下:
这其中最主要的问题是:用户下单时看到的产品是产品缓存,只是依据产品缓存就让用户进行了下单购买,这显然是不可靠的。
需要在用户下单的时候对产品的正确性进行验证。
针对这个问题,我们对下单流程进行优化,在用户进行支付前,添加下单前校验功能,对产品数据进行校验(价格,库存等)。
下单前校验的底层接口由供应商提供,要求实时校验产品数据,不能使用缓存数据。
经过我们的大力推动与行业的整体发展,供应商目前都意识到了该问题的重要性,基本都会提供相关接口以提升用户体验。
流程如下,绿色部分为新添加的下单前校验功能:
同时对于校验失败的产品会及时更新产品缓存,避免其他用户重复对失效产品进行反复下单。
在完成上述的改造之后,用户退款单量下降了一个数量级,由原来每天几千单下降到了几百单,用户体验大大提升。
那么为什么每天还会有几百单的退款?
用户下单前校验通过后,可能要过一段时间才会支付(支付等待时间,美团App为30分钟),恰巧在支付的过程中,产品库存不足或变价都会导致预订失败,在酒店的预订旺季问题会更加突出。
针对变价问题,可以优化流程告知用户,用户可以选择继续购买。
针对库存不足问题,可以为用户继续推荐其他产品。尽量满足用户需求。
以上问题不属于本文讨论范畴,故不再展开讨论。
流程演进为:
基于用户下单行为更新数据,解决了“非第一个用户”重复下单的问题,但“第一个用户”被我们牺牲掉了。我们能否为“第一个用户”做些什么?或者说是如何减少“第一个用户”的存在?答案是肯定的。 在用户浏览页面的时候,异步通知直连系统,为用户提前准备可能购买产品的相关数据,如下图:
在这里有个策略问题:直连酒店详情页的浏览每天有几千万次,直连系统提供的异步接口QPS可以达到几百,过滤后的访问量也还是很大,将这些访问量全部转化成对于供应商系统的数据拉取,会导致供应商系统过载,甚至崩溃。这里我们针对每个不同的供应商设置一个“数据最小拉取时长”,小于该时长的访问,不再重复进行拉取,以减少供应商系统的访问次数。
例:P供应商,设置数据拉取时长为60秒。
A用户在10:00:00时访问H酒店的列表页,异步更新酒店产品数据。 B用户在10:00:59访问H酒店的列表页,不进行更新。 C用户在10:01:01访问H酒店的列表页,异步更新酒店产品数据。
流程演进为:
至此,我们已经解决了产品数据拉取的绝大多数问题,基本可以保证用户的正常购买。
谋求数据一致性提升必定带来系统成本的消耗,如何降低系统运行成本将是未来我们需要思考的方向。
数据的有效预测可以帮助我们很大程度上降低成本消耗。
仍以美团直连平台为例,触发式更新确实解决了“第一个用户”的问题,虽然我们使用了“数据最小拉取时长”的方案,但新增大量访问对供应商系统还是造成一定的压力。
如:P供应商,包含1000家酒店,数据最小拉取时长为:120秒。
访问量:1000(酒店数量)×30(每小时访问次数)×24(每天24小时)=720000
是不是有办法减少访问次数?同时尽量避免减少访问数次对用户的影响?答案也是肯定的。
我们抽象一下问题即为:在数据过载的前提下,及时为用户提供有意愿购买的产品信息。
那么什么是用户有意愿购买的产品呢?
可以简单的根据二八定律(20%的产品会给我们带来80%的收益),来维护这20%的头部产品数据,来达到我们的目的。
这20%的头部产品数据怎么获取?单纯的已浏览量和订单量,好像都不太正确。 回看一下问题中的关键词:数据过载,有意愿购买,产品信息,这些关键词都指向了一个明确的实现方案——推荐系统。
推荐系统常规的使用方式向用户推荐用户感兴趣的信息和商品。
我们这里对推荐系统进行灵活运用,当预测到用户对某些信息或商品感兴趣时,为用户提前准备好信息或商品数据。
推荐系统架构图:
我们可以根据购买历史、价格区间、重点商圈、热销品牌等产品多维度信息,使用基于物品的协同过滤算法,区分出高中低频用户有意愿购买的产品,实现不同的数据拉取频率,以降低供应商接口的访问次数。
如果我们面临的属性维度极其复杂,要分析的数据量也十分巨大的时候,协同过滤算法可能就不适用了,这时可以考虑基于深度神经网络的推荐系统。
关于推荐系统这里不再展开讲述。
流程演进为:
目前该方案我们还没有实现,但这是我们的发展方向。
虽然我们一直致力于完善我方系统提高数据一致性,但不可否认的是,最有效的手段还是谋求合作双方的合作,而这往往是个长期、艰苦卓绝、潜移默化的过程。虽然有着共同的目标,但由于工作量的增加对方往往并不积极配合,推动合作方系统的改进工作通常十分艰难。当然,这并不能阻止我们不断前进的步伐,我们在实践中逐渐摸索出一套方案,那就是:建立有效的沟通渠道+有力的技术支持。
应用前提:保持良好的沟通渠道,开发接口具备便利性和标准化。
方案优点:降低系统的访问次数,维护成本降低,数据准确度提升。
方案缺点:需要提供接入的标准API,同时沟通成本较高。
案例分析:在我们和供应商合作的过程中,经过我们的不断推动,供应商也意识到了,当数据发生变化时,主动推送数据给我们是最好的解决方案。
如图:
主动推送数数据其优势表现在:
酒店开放平台在适宜的时候开始提供标准API,部分有技术能力的供应商开始进行接入。
接入前为供应商提供统一的网站入口,提供接入文档,在线测试工具,常见问题答疑,在线问题解答等多方面的接入支持。
接入后提供数据分析平台,对接入数据实时进行统计。
采取以上措施之后,供应商对接入更加可控,线上产品运营情况更加透明。这样一来,供应商的接入意愿就有了极大的提升。
演化后的流程为:
通过对获取产品数据功能的持续改造,使得直连系统为用户提供了可靠的数据来源。
总结一下上述四个阶段使用的数据的更新方式,分别为:
直连数据一致性问题改造后,直连数据同步的架构如下所示:
数据一致性的问题是O2O行业中最常见的问题,掌握一套有效的解决方案对项目建设,尤其是系统对接类的项目建设尤为重要。这里为大家介绍的是美团酒店直连平台应对此类问题时的具体实践。其中,随着项目规模变化而采取不同的应对方法是我认为最值得借鉴的地方。四个阶段的论述之前我分别对应用前提、方案优点、方案缺点加以说明,旨在让大家更有针对性的比对,结合自身系统现状予以应用。接着通过美团酒店直连平台的案例进行分析,从而方便大家更直观的理解。
美团酒店直连平台的成长是个充满挑战的过程,通过钻研和磨砺,平台的健壮性和运行效率显著提升。受篇幅的限制,很多细节无法详尽描述,数据一致性问题的解决也绝非一篇博文就能面面俱到,好的方案还需因地制宜才能充分发挥效用。上述供应商技术能力不足的问题,可以通过对方案灵活组合运用来解决。而对于此类相关的疑问,欢迎各位留言共同探讨。
技术平台的建设和维护,是个道阻且长的过程,数据一致性的问题仅仅是沧海一粟。希望这篇博文在数据一致性问题上可以为大家提供一些思路和借鉴。
不想错过技术博客更新?想给文章评论、和作者互动?第一时间获取技术沙龙信息?
请关注我们的官方微信公众号“美团点评技术团队”。现在就拿出手机,扫一扫: