任健
(上海信息技術(shù)學(xué)校,上海200331)
面對“互聯(lián)網(wǎng)+”的大潮,各種商業(yè)模式不斷涌現(xiàn),O2O 商業(yè)模式最貼近消費者的日常生活,是互聯(lián)網(wǎng)更好服務(wù)人們的體現(xiàn)[1]。作為對于O2O 模式的探索,“快的打車”和“滴滴打車”自上線后,用戶數(shù)便快速攀升[2]?,F(xiàn)如今,網(wǎng)約車服務(wù)基本覆蓋了我國各大城市,青年人幾乎人手一個打車APP[3]。
本O2O 打車APP 采用客戶機/服務(wù)器(C/S)+瀏覽器/服務(wù)器(B/S)的體系架構(gòu),C/S 架構(gòu)主要為手機APP 與服務(wù)器端的通信和功能實現(xiàn),服務(wù)器端部署在阿里云上。B/S 架構(gòu)主要通過瀏覽器呈現(xiàn)的方式為APP 運營方提供與服務(wù)器間的通信和功能實現(xiàn)。
圖1 APP 的體系架構(gòu)
自動匹配及接單系統(tǒng)包含訂單派發(fā)、尋找司機(車輛)、司機搶單、自動匹配、修改訂單等五個模塊。訂單派發(fā)模塊用于派發(fā)有效訂單;尋找司機(車輛)模塊用于尋找附近車輛,并向司機推送訂單信息;司機搶單模塊用于司機應(yīng)答訂單;自動匹配模塊用于高效匹配司機;修改訂單模塊用于訂單信息修改等。
圖2 自動匹配及接單系統(tǒng)的主要模塊
對網(wǎng)約車訂單分配策略的研究,有助于減少乘客等待時間、提高司機收益、減少司機空載距離、提高資源利用率[4]。系統(tǒng)判定訂單數(shù)據(jù)有效后,派發(fā)訂單并尋找3 公里范圍內(nèi)的司機(車輛),若尋找失敗則擴大范圍。系統(tǒng)將對符合條件的司機(車輛)進行排序,并推送訂單信息,隨后進入司機搶單流程,搶單成功則進入訂單執(zhí)行環(huán)節(jié),搶單失敗則進入訂單等待狀態(tài)。
圖3 司機端自動匹配及接單系統(tǒng)業(yè)務(wù)流程
司機端搶單模塊要保證所有在線且空閑的司機實時獲得系統(tǒng)推送消息,繼而進行搶單操作,并最終根據(jù)司機搶單的先后順序判定搶單是否成功,是APP 功能模塊設(shè)計中的一個核心難點。本APP 采用基于Mina 的異步Socket 協(xié)議來突破這一難點,在采用異步方式進行請求響應(yīng)、通過消息隊列分層、多進程處理的模式,服務(wù)器端的應(yīng)用可以在處理響應(yīng)的高峰期,不斷啟動處理進程來進行自身的服務(wù)擴展[5]。司機端與服務(wù)器端建立Socket鏈接;訂單信息判定為有效后,服務(wù)器將對符合條件的司機端進行廣播;司機搶單成功后,服務(wù)器調(diào)用回程線程推送搶單結(jié)果。
如果當(dāng)前沒有司機響應(yīng)搶單,為確保快速應(yīng)答客戶,系統(tǒng)將自動查詢訂單附近的所有空閑車輛,并自動根據(jù)就近原則將訂單派送給接駕最快的車輛,司機可以根據(jù)實際情況選擇是否接單。
若自動匹配模塊選擇的車輛司機拒絕接單,APP 的后臺運營人員可以視情況,根據(jù)司機綜合評價排序,將該訂單強制派發(fā)給相關(guān)車輛及司機,強制派單后司機收到訂單并默認(rèn)開始執(zhí)行。
作為一個O2O 打車APP 的核心功能,司機端搶單功能的公平性、有效性將直接影響司機和用戶的使用體驗,通過技術(shù)保障和邏輯控制,我們將為所有符合訂單搶單條件的司機提供搶單機會,結(jié)合自動匹配功能保證打車用戶的訂單能夠得到及時的響應(yīng)和對接。
Android 系統(tǒng)司機端的部分核心代碼如下,APP 通過Flag 值判定搶單是否成功,搶單成功車輛及司機將前往用戶定位點接駕,搶單失敗或用戶取消則進入下一輪搶單流程:
根據(jù)搶單功能的技術(shù)需求,其核心為司機端與服務(wù)器端常連接狀態(tài)的保持,只有這樣,司機才能在第一時間接收到系統(tǒng)派發(fā)的用戶訂單,并保持實時響應(yīng)。我們選用了ApacheMina 框架,它有助于開發(fā)高性能、高伸縮性的網(wǎng)絡(luò)應(yīng)用程序,其核心為JavaNio 技術(shù)基于不同網(wǎng)絡(luò)傳輸協(xié)議的抽象、事件驅(qū)動的異步API,通過靈活地使用框架,我們可以保證司機端功能的正常運行,響應(yīng)高效,回調(diào)迅速,對于消息推送、搶單及反饋等高并發(fā)業(yè)務(wù)環(huán)節(jié)具有顯著優(yōu)勢。同時,不需要考慮與底層傳輸相關(guān)的具體細(xì)節(jié),而只需要處理抽象的I/O 事件[6]。
圖4 建立連接、啟動服務(wù)、設(shè)置心跳參數(shù)的相關(guān)代碼
司機端使用Socket 協(xié)議與服務(wù)器端建立連接后,啟動相關(guān)服務(wù)并設(shè)置心跳參數(shù),即通過持續(xù)、指定間隔的數(shù)據(jù)發(fā)送和反饋,確認(rèn)司機端與服務(wù)器端的持續(xù)連接狀態(tài)。
以上代碼實現(xiàn)了對司機端狀態(tài)的持續(xù)監(jiān)控,當(dāng)司機端APP開啟、網(wǎng)絡(luò)正常、接單狀態(tài)下,通過獲取當(dāng)前時間和心跳狀態(tài)進行判定,如心跳包發(fā)送失敗則重新連接。我們在使用線程鎖的同時,專設(shè)了一個監(jiān)控線程,通過兩個線程的互相監(jiān)控,確保心跳線程的持續(xù)運行。
綜上,本文基于一個O2O 打車APP 的體系架構(gòu)、功能設(shè)計,對司機端自動匹配及接單系統(tǒng)中的司機搶單、自動匹配、強制派單等模塊進行了論述,對基于ApacheMina 框架實現(xiàn)司機端常連接的功能進行了研究,較為細(xì)致地闡述了核心技術(shù)思路及編碼邏輯。