类Uber/滴滴分单引擎中应用到的技术原理 (2)
结合之前文章- 类Uber/滴滴分单引擎中应用到的技术原理 (1)
回顾上一节,提到了此类‘分单引擎’ 核心需要解决的问题是:完成叫车订单的分配。策略上的核心原则是:“站在全局视角,尽量去满足尽可能多的出行需求,保证乘客的每一个叫车需求都可以更快更确定的被满足,并同时尽力去提升每一个司机的接单效率,让总的接驾距离和时间最短。”
那么,进行合理推断,业务上需要解决的核心问题如下:
- 如何且何时去触发乘客订单和司机之间的匹配计算进而完成派单(除了派单这种模式,何种场景下会使用抢单模式)才能满足乘客乘车需求?
- 考虑不同乘客的订单需求(接乘体验、效率)、司机自身的需求(如,有的司机只想接回家顺路单、司机只在限行区域内行驶、司机只听预约单),那么如何保障在各种业务场景都正确性的前提下,来找目标函数下的最优解?
- 从打分分配过程来看,目标函数考虑的因素不仅考虑乘客与司机之间的导航距离,还会考虑到司机的服务等级分、价格、供需紧张程度等多种因素。那么,如何在效率指标和成本等指标之间做出权衡?
- 在垂直的子场景下,优化子场景的目标,从而间接支撑核心目标,如动态定价、供需调度(基于供需热力图,给司机发空单调度司机到需求密度更好的地区)、分场景派单(机场、火车站的派单距离会长一些,且进行公平派单 - 先来后到的原则)、不同运力层之间互转(运力不足等情况下,快车单给专车)
... ...
可以预见,继续推导下去,需要解决的业务问题还有很多,但尝试对这类‘分单引擎’做一个总结和定位的话,应该有如下几个要点:
- 职责: 在合适的时刻,把合适的订单,分配给合适的司机
- 主要的业务目标: 兼顾业务运营上的需要,保障体验和全局效率最优
- 猜测来看,从业务运营上,应该会分各类不同的场景,且围绕不同场景,定义出更具体的成本、体验、效率的指标,足见‘分单引擎’是实现业务运营目标的重要抓手
- 系统上的目标 :支撑全国各个城市(跨城)订单最优分配,保障系统对于业务规则类需求和策略类需求能够快速扩展开发落地、系统架构具备根据容量规模的横向扩展能力以及性能保障
- 逻辑结构上,需要能够将分单的整个过程进行抽象,拆分成相对固定的模块/步骤。围绕模块/步骤,再嵌入可插拔的规则扩展实现。如,
- 通过规则引擎来支撑上述所需要的为保障分单业务正确性的各类业务规则;
- 通过策略引擎让算法同学基于统一的同一套数据结构可以按场景去叠加各种寻优策略来找到最优匹配(如,二分图,乘客与司机可以为两个顶点集合,通过计算各种边的权重,以找到图的最大匹配));
- 核心系统架构上,需要有,
- 实现‘延迟分单’的定时器
- 有能够进行全局资源监控和管理的资源管理器
- 有对分单计算任务和资源匹配的任务调度器
- 有用于具体执行分单匹配计算的任务计算节点服务。且在任务执行过程中,可以根据任务计算量,动态决定拆分一个大任务成多个可并行执行的小任务,然后再聚合结果
- 存储着司机位置、订单数据等高效的索引存储系统
... ...
从上图可以看出,一次分单计算的任务类似一次Hadoop 中MapReduce的批量的执行计算任务过程(结合Yarn 资源调度管理来说):
- 定时触发生成的Job中,所有需要匹配计算的订单和司机数据,类似于MR程序要处理的数据;只是真正执行的程序不像MR Jar 那样,可以在Hadoo环境下,执行时再通过HDFS动态加载执行(即移动计算式的方式)。这里,执行的匹配计算逻辑,都预先启动在各个分单计算节点当中;
- 提交的任务根据需要计算的任务负载,从资源管理器匹配可以满足其需求的资源(包括master 机器信息以及可以进行并行执行子任务的Slave 机器信息)。根据任务的大小,如Yarn中所支持的能力(Uber 模式和non-uber 模式),可以实现动态判定对小任务类的匹配逻辑都执行在一个机器资源中并一起顺序执行,而大任务类的匹配计算(订单和司机之间的匹配过滤、打分等逻辑)则由资源管理器预先分配好哪些机器可以用于执行具体的匹配计算任务(包括指定一个Master节点和多个Slave 节点),在Master 节点中可以根据预先配置的分片阈值,拆分成多个分片,在并行执行完之后,再回到Master 节点执行最终的司机派单计算;
- 每个任务计算执行节点,定期上报自己的资源使用情况。Yarn中是通过Container 的抽象概念,综合了CPU、内存等多维度的资源模型;而基于统一的资源管理器和无状态的分单计算节点集群(被资源管理所管理),并结合任务大小自动决策资源分配,将使得资源可以在充分利用的情况下,并支持水平扩容;
绛旓細Uber Uber鏄渶涓虹煡鍚嶇殑鍥藉鎵撹溅杞欢涔嬩竴锛岀洰鍓嶅凡缁忚鐩栦簡鍏ㄧ悆600澶氫釜鍩庡競銆傚湪Uber涓婂彲浠ヨ交鏉惧湴鍙埌绉佷汉杞﹀拰鍑虹杞︼紝鍚屾椂鍙互閫夋嫨涓嶅悓鐨勬湇鍔$被鍨嬶紝鍖呮嫭UberX銆乁berBLACK銆乁berPOOL鍜孶berEATS绛夈備娇鐢║ber鏀粯涔熼潪甯告柟渚匡紝鍙互閫夋嫨缁戝畾淇$敤鍗℃垨浣跨敤PayPal璐︽埛銆侺yft Lyft鏄疷ber鐨勪富瑕佺珵浜夊鎵嬩箣涓锛岀洰鍓嶅湪缇庡浗鍜屽姞...
绛旓細棣栧厛锛屽畠搴旂敤鍦ㄤ竴涓钩鍙颁箣涓婏紝骞冲彴绮樺悎涓庡尮閰嶄簡澶氭柟鐨勯渶姹傦紙Uber/婊存淮 -- 涔樺涓庡徃鏈猴紝澶栧崠 -- C绔敤鎴枫佸晢瀹朵笌楠戞墜锛夈傚钩鍙颁互绉瀬鏋勫缓缃戠粶鏁堝簲涓虹洰鐨 -- 闇姹傝秺澶氾紝渚涚粰灏辫秺澶氥傚叾娆★紝瓒婂ぇ鐨勮妯★紝瓒婃湁鍔╀簬骞冲彴鏉ヤ紭鍖栭渶姹備笌渚涚粰涔嬮棿浜や簰鐨勪环鍊煎崟鍏冿紝濡傦紝Uber/婊存淮瀵逛簬涔樺鎻愪緵鏇寸煭鏃堕棿鎺ヤ箻鐨勫徃鏈猴紱...
绛旓細鏍规嵁浠诲姟鐨勫ぇ灏忥紝濡俌arn涓墍鏀寔鐨勮兘鍔涳紙Uber 妯″紡鍜宯on-uber 妯″紡锛夛紝鍙互瀹炵幇鍔ㄦ佸垽瀹氬灏忎换鍔$被鐨勫尮閰嶉昏緫閮芥墽琛屽湪涓涓満鍣ㄨ祫婧愪腑骞朵竴璧烽『搴忔墽琛岋紝鑰屽ぇ浠诲姟绫荤殑鍖归厤璁$畻锛堣鍗曞拰鍙告満涔嬮棿鐨勫尮閰嶈繃婊ゃ佹墦鍒嗙瓑閫昏緫锛夊垯鐢辫祫婧愮鐞嗗櫒棰勫厛鍒嗛厤濂藉摢浜涙満鍣ㄥ彲浠ョ敤浜庢墽琛屽叿浣撶殑鍖归厤璁$畻浠诲姟锛堝寘鎷寚瀹氫竴涓狹aster鑺傜偣...
绛旓細鍥藉鎵撹溅杞欢鏈夛細Uber銆佹淮婊淬丩yft鍜孋areem绛銆1. Uber Uber鏄竴娆惧湪鍏ㄧ悆鑼冨洿鍐呭箍娉涗娇鐢ㄧ殑鎵撹溅杞欢銆傚畠鎻愪緵浜嗕究鎹风殑鍙溅鏈嶅姟锛岀敤鎴峰彲浠ラ氳繃鎵嬫満搴旂敤绋嬪簭蹇熼绾﹁溅杈嗭紝鍙告満鍜屼箻瀹㈠彲浠ラ氳繃鍐呯疆鐨勫湴鍥惧拰閫氳鍔熻兘杩涜瀹炴椂娌熼氬拰杩借釜杞﹁締浣嶇疆銆俇ber鐨勮溅杈嗙绫荤箒澶氾紝浠庣粡娴庡瀷鍒拌豹鍗庡瀷閮芥湁锛屾弧瓒充簡涓嶅悓鐢ㄦ埛鐨勯渶姹傘2...
绛旓細缃楀閫娾濓紙Robinson锛夈2. 缃楀閫婅繍钀ユā寮忕被浼间簬Uber锛岄噰鐢ㄨ交杩愯惀绛栫暐锛屽厑璁稿钩鍙颁笂鐨勭敤鎴锋帴鍗曪紝骞跺皢璁㈠崟鍒嗛厤缁欓檮杩戠殑璐ц溅鎴栬溅闃熻繘琛岃揣鐗╄繍杈撱3. 浣滀负鍖楃編鏈澶х殑绗笁鏂圭墿娴佸叕鍙革紝缃楀閫婃瀯寤轰簡瑕嗙洊鍏ㄧ編鐨勫崱杞﹁繍杈撶綉缁溿4. 鍒2013骞达紝缃楀閫婄殑钀ユ敹宸茬粡杈惧埌浜128浜跨編鍏冿紝鍦ㄥ叏鐞500寮轰紒涓氫腑鎺掑悕绗237浣嶃
绛旓細浜屻乁ber Uber鏄竴娆惧浗闄呮х殑鎵撹溅搴旂敤锛屽湪鍏ㄧ悆鑼冨洿鍐呴兘鏈夊緢楂樼殑鐭ュ悕搴︺傚畠鎻愪緵浜嗙被浼兼淮婊寸殑鏈嶅姟锛岀敤鎴峰彲浠ラ氳繃鎵嬫満杞绘澗鍙埌杞﹁締銆Uber鐨杞﹁締绫诲瀷澶氭牱锛屽寘鎷櫘閫氳娇杞︺佽豹鍗庤溅鐢氳嚦涓撹溅鏈嶅姟銆傚叾渚挎嵎鐨勫彨杞︽柟寮忓拰鍚堢悊鐨勪环鏍肩瓥鐣ュ惛寮曚簡澶ч噺鐢ㄦ埛銆備笁銆侀姹界害杞 棣栨苯绾﹁溅鏄竴娆句笓涓氱殑缃戠害杞︽湇鍔¤蒋浠讹紝鎻愪緵楂樺搧璐ㄧ殑...
绛旓細浜屻Uber Uber鏄竴娆惧浗闄呭寲鐨勬墦杞﹁蒋浠讹紝鍦ㄥ叏鐞冭寖鍥村唴閮芥湁骞挎硾鐨勪娇鐢ㄣ傚畠鐨勬湇鍔$被鍨嬪鏍凤紝鍖呮嫭鏅氳娇杞︺丼UV銆佽豹鍗庤溅绛夛紝婊¤冻涓嶅悓闇姹傘俇ber閫氳繃鍏堕珮鏁堢殑鍙告満绠$悊绯荤粺鍜屾櫤鑳芥淳鍗曠郴缁燂紝涓轰箻瀹㈡彁渚涗究鎹风殑鍑鸿鏈嶅姟銆備笁銆侀姹界害杞 棣栨苯绾﹁溅鏄竴娆句笓娉ㄤ簬涓珮绔競鍦虹殑鎵撹溅杞欢锛屾彁渚涚殑鏈嶅姟鍖呮嫭棰勭害绉熻溅銆佸嵆鏃剁敤杞︾瓑...
绛旓細鐩墠Uber鐨鏈嶅姟鍒嗕簡5绫伙細浜烘皯Uber銆乁berX銆乁berBlcak銆乁berXL銆佸皧浜紱浜烘皯Uber 浜烘皯Uber锛岄【鍚嶆濅箟锛屼汉姘戝槢锛岄傚悎鏅氬ぇ浼楋紝缁忔祹鍨嬶紝鏄疷ber涓渶渚垮疁瀹炴儬鐨勪竴绉嶃備釜浜鸿嚜甯﹁溅鍙兘鍋氫汉姘戜紭姝ワ紝鍙互鍏艰亴鍋氾紝UberX鍜孶berBlack鏄疷ber鍜屾苯杞︾璧佸叕鍙哥璁㈠悎鍚岀殑锛屽仛鍏ㄨ亴銆俇berX UberX鏄疷ber鍜屾苯杞︾璧佸叕鍙哥璁㈠悎鍚...
绛旓細2012骞 zimride (lyft鐨勫墠韬)寮濮嬭繘鍏ユ墦杞﹀競鍦哄悗锛Uber鐨甯傚満浠介鎬ュ墽涓嬫粦銆備负浜嗗簲瀵癸紝鎺ㄥ嚭Uberx(寤変环鐗堢殑Uber)涔熷氨鏄敤榛戣溅, 鏃犵墝鐓ц溅鏉ヨ窇鍗曞瓙锛屼笅闈㈢殑鍥炬槸鍦ㄧ編鍥5鍏噷宸﹀彸鐨勮窛绂荤殑浠锋牸銆傝繖涓窛绂讳紶缁熺殑鍑虹杞﹁浠15缇庡厓宸﹀彸銆傚彲浠ョ湅鍑猴紝宸环寰堝ぇ銆 浣嗘槸鍙告満涓鐩村湪鎶楄锛屽洜涓哄緢澶氬徃鏈鸿楠楁潵鐨勶紝鍙告満鐨...
绛旓細1.绠浠 鍦ㄩ娓紝鎵撹溅杞欢宸茬粡鎴愪负鐢熸椿涓繀涓嶅彲灏戠殑涓閮ㄥ垎锛屽挨鍏舵槸鍦ㄦ梾娓稿鑺傦紝鏃犺鏄娓競鍖鸿繕鏄節榫欏湴鍖猴紝涔樺潗鎵撹溅杞欢鏄竴绉嶈交鏉炬柟渚跨殑鍑鸿鏂瑰紡锛屽悓鏃朵篃閬垮厤浜嗕氦閫氭嫢鍫电殑鐑︽伡銆2.棣欐腐鎵撹溅杞欢鎺ㄨ崘 鍦ㄩ娓紝瀹為檯涓婃湁璁稿涓嶅悓绫诲瀷鐨勬墦杞﹁蒋浠跺彲浠ラ夋嫨锛屼緥濡Uber銆佹淮婊村嚭琛屽拰鏄撳埌绛夌瓑锛屼絾鏄紝濡傛灉鎮ㄦ兂瑕佸湪...