“定制游”逐渐成为旅游行业“消费升级”的主流模式。随着用户对旅游服务的要求越来越高,对于行程安排有个性化需求的消费者,常规的跟团游和自由行产品难以满足他们的需求。在这样的环境下,马蜂窝电商平台除了提供机票、机票、酒店等“标配”产品外,也在不断探索如何充分结合现有供应商和旅游定制商的资源。足以满足用户需求,打造多元化服务。2018年6月,马蜂窝电商业务推出了支持多单抢单的“定制化旅游交易系统”(图1)。与以往连接人与产品的电商产品不同,定制旅行的本质是连接人与服务,更好地将有定制旅行需求的消费者与有能力承接的供应商和旅行定制商进行匹配。图1—马蜂窝定制旅游交易系统通过抢单模式带来的定制旅游平台升级。通过定制旅游平台,用户可以根据自己定制的主题(个人/企业)、出发地、目的地、往返时间、人数、预算等进行提交。针对个性化出行需求,系统通过抢单、派单等方式,将需求与具备承接能力的供应商对接。最初,定制旅行系统采用裁缝向供应商分发请求的解决方案。这种做法有几个明显的缺陷,例如:人力承接问题:假设供应商的控制资源已经饱和,分配了需求,没有能力承接,造成需求资源的浪费;资源控制问题:当某个目的地进入淡季时,为了减少成品,供应商对资源的控制能力减弱,没有办法承接需求。为此,研发团队首先开发了多工单系统。当用户提交定制请求时,系统根据用户选择的定制商数量,分派给多个供应商的多个定制商,系统在此基础上进行定制。此次升级新增抢单功能,主要面向有热门目的地定制游需求的个人用户。用户提交定制需求后,系统会根据用户的特征数据与供应商和定制商的特征数据进行算法匹配,从而实现用户和定制商的双向选择。每个定制请求最多支持三个供应商的定制师同时抢单并为用户提供旅行计划,由用户选择并最终确认其中一个定制师的旅行计划为用户服务。抢单系统带来的几个好处是:提高商家积极性,通过竞争提高商家跟单速度和转化率,解放BD大量工作量,实现更好的商家运营和转化效果,提升整体平台转化率,将马蜂窝平台上的需求释放给长尾商家,解决长尾商家无法从商品排名中获取流量的问题,从而达到培养和发现潜在商家的效果。求单,提高转化率图2-多工单系统改造抢单系统的关键是高效的资源匹配和信息沟通。因此,抢单系统的核心设计有两个要点,一是抢单池的消息队列,如何满足并发要求;另一个是消息通知服务,如何及时有效的通知定制商。核心技术实现了并发控制,抢单功能让同一需求可以同时被多个供应商的多个定制商抓取。用户提交请求后,会进入统一的抢单消息队列。对于每个需求,最多三个定制员同时为用户提供服务;同一个企业内,只能有一个定制员抢单。在降低并发方面,主要是通过以下两点来实现的:1.定制器分级,使用马蜂窝消息总线延迟消息服务,根据级别延迟通知。根据供应商和定制商的业务范围,BD和运营是根据定制商的服务能力对定制商进行定期考核和分级,不同的定制商可以通过商户后台或微信看到不同的订单池队列公众号。通过使用电商自研的消息总线服务,根据定制商的服务范围进行异步分发,同时利用排名信息过滤订单池队列,保证所有定制商的同一层级同时看到同一个订单池队列。2.控制并发锁的粒度和锁的释放,防止死锁。抢单接口调用时进行十余种业务防刮控制。最后通过长连接自动更新抢单池,将抢单需求从抢单池中移除,避免过度打扰用户,减少定制商竞争造成的资源浪费。海关旅游交易系统采用Ko框架。关于使用文件锁还是Redis锁来控制并发的问题,主要考虑:文件锁Ko_Tool_Lock.php没有自动释放expire锁的机制。如果没有正常释放锁,就会死锁。ko的$oRedis->bSetNX可以加锁,可以设置expire,但是问题是不支持setNx同时设置ex(拆分成2步,不是原子操作),性能测试有抢单并发度高。可以回收资源以进行重新分配。因此,对于发起抢单请求的定制员,可以先查看是否有超时未释放的锁。如果有,则强制释放锁,然后重新尝试获取锁。图3-锁控消息通知-长连接据统计,定制师接触用户需求越及时,需求转化率越高,及时得到抢单消息通知非常重要。消息通知主要有两种方式:PC端的消息弹窗,和移动端的微信公众号模版消息。实现抢单池有变化,第一时间提醒定制员,使定制员无需刷新抢单池即可实时看到最新的待抢需求。这里介绍一下长连接服务的解决方案,并对应用层进行了如下优化:1、长连接复用定制器在查看商户后台打开多个页面时,系统需要在当前活动页面进行通知.从理论上讲,每个窗口理论上都需要提供一个长链接服务。但是对于长链接来说这无疑会造成资源的浪费。这个问题可以使用“长连接复用”的方法解决:(1)同一个浏览器的多个标签页之间共享一个长连接ID(setcookie),重启浏览器创建一个新的connid(2)同一个浏览器,来回切换用户,一个用户只生成一次长连接ID(redishash)。2.消息广播同一个浏览器的多个tab页复用connid,相互广播。如果活动窗口中有没有监听到的消息,就会广播到活动窗口上去。图4抢单系统的消息通知和广播3.重试机制网络异常是不可避免的。我们不知道什么时候会断网,导致长期连接断开,影响消息通知。采用重试机制,限时,监控网络异常。当长期连接断开时,指定在短时间内自动重试。超过最大重试次数后,会自动延??长重试间隔,防止出现服务雪崩问题。图5-重试机制4.Lua协程初始长连接请求命中服务器后,服务器通过PHP进程接受。项目上线后,发现了一个问题。服务器上的请求长期挂在比较高的点,能处理的长连接需求有限。而且特点是内存比较大,但是CPU消耗比较小。后来我们采用了Lua协程的方案,不再把请求转给PHPFPM,而是转给Lua来减少内存消耗。总结及未来规划定制化抢单功能的推出,促进了供应商之间的良性竞争,可以动态分配供应商的服务能力和资源控制能力,确保用户的需求得到充分满足。此外,在一定程度上促进了供应商内部定制商考核体系的不断完善。更重要的是,定制游戏平台的收入转化率大幅提升超过70%。本文作者:王维扬,马蜂窝技术专家,2017年加入马蜂窝,目前负责马蜂窝电商度假业务的开发。2010年毕业于中国农业大学研究生院。曾就职于甲骨文和百度。一直从事分布式拓扑环境任务调度与报告系统、工程效率与质量平台与工具、评估评价系统等方面的研究与开发。【本文为专栏作者马蜂窝科技原创文章,作者微信公众号马蜂窝科技(ID:mfwtech)】点此查看作者更多好文
