機票垂直搜索引擎的性能優化

機票垂直搜索引擎的性能優化
原文:機票垂直搜索引擎的性能優化

一、行業背景與垂直搜索

我們先了解一下機票的行業背景,下圖是由中航信統計的數據,藍色的曲線代表平均每公里的票價,紅色曲線指的是客運量。從2011年到2016年,無論是國內、港澳臺還是國際,整體趨勢都是機票價格便宜了,坐飛機的人也越來越多了。特別是國際機票,這五年里機票價格下降30%,客運量增長了140%。

乘客越來越多,購買機票的渠道有哪些呢?現在主要有三個:網絡平臺、代售點和航司官網。像攜程、去哪兒、飛豬、同程等,是主流的網絡購票平臺;像旅行社這類代售點,是旅行團的主要購票渠道;同時大部分航空公司的官網也可以購票,而且有相對較低的價格。總體來說,網絡平臺是最大的銷售渠道,占比76%。為什么網絡平臺占有這么大的份額呢,主要原因是機票垂直搜索引擎是主要的用戶流量入口,用戶一般是先比價然后再去預訂,一個好的機票搜索引擎查詢的產品豐富、價格便宜,而且響應速度快,運價也準,這些特性在技術方面實現好并不容易。

二、主要問題與解決方案

機票查詢要快、準、低。快是指查詢快,能夠提供一個良好的用戶體驗;準是指運價準,可以保證出票的成功率;低是指票價低,能夠吸引更多的用戶。但是,如果票價要有優勢,就要有大量產品,產品數據多了查詢就慢,如果查詢要快,就必須要緩存,但是數據緩存了,運價就可能不準。這三者是矛盾的,類似于CAP原則,具體示意圖如下:

對于以上問題,怎么解決呢?通用的三個技術方案有:一、用DB+Redis平衡響應速度、數據實時性和查詢成本;二、用削峰填谷的MQ來處理高并發;三、將業務服務化、模塊解耦。這些只是通用的技術點,并沒有什么難度,我們這里重點介紹與最終結果密切相關的四個模塊:靜態數據、緩存策略、實時查詢、政策匹配。

  1. 靜態數據:能靜態處理的數據盡量靜態化,存儲到本地,可以是數據庫或緩存,以方便快速地查詢,如航班信息、運價數據和政策數據等;
  1. 緩存策略:從中航信拿到運價數據之后,進行熱冷門數據分類,數據永不過期但持續更新,自主控制數據的更新頻率;
  1. 實時查詢:多渠道多供應實時獲取遠端數據,多數據源查詢速度會變慢,遠端服務不可控,解決方案是三段超時,即前端用戶超時、中端運營超時、后端供應超時;
  1. 政策匹配:大量的產品數據和大量的業務規則,不可能都提供給用戶,需要通過一定的算法進行匹配過濾、排序等。
三、靜態數據與任務打底

機票查詢的靜態數據主要有:城市、機型、航司、運價數據等,這里重點介紹較為復雜的運價數據,運價數據的獲取雖然間隔時間較長,但數據量大且更新頻次不同。運價數據是由中航信統一提供的,有兩種途徑:黑屏查詢和IBE接口,將獲取到的數據保存到數據庫和緩存中,用戶查詢的時候直接從緩存中獲取,同時也會按照一定的緩存策略來更新。

最初我們設計了兩套方案來打底運價數據,兩個方案各有優劣。方案1是先預加載所有的運價數據,然后全部保存到數據庫和緩存,然后在航班查詢時通過緩存策略進行相應地更新;方案2是把運價數據根據航線查詢頻率分為熱門和冷門數據,然后每天凌晨對熱門數據預加載,并在航班查詢的時候對冷門數據進行更新。可以看出,方案1能保證數據的完整性和實時性,但預加載用時太長;方案2能控制預加載用時,但熱門數據的實時性會從早到晚逐漸降低。兩個方案中都需要實時更新,在考慮數據實時性的同時,還要考慮獲取數據的費用,平衡好兩者才是一個實用的方案。

綜合對比之后,我們采用了方案1,具體實現如下圖所示:首先是通過Job對運價數據的初始化,然后以任務消息的方式發送給MQ,MQ里的消息會被后臺服務自動消費,執行消息隊列里的任務,把運價數據保存到數據庫和緩存。數據預加載之后,用戶在前臺查詢時,如果緩存里面沒有數據,或者查到的緩存數據是過期的,系統會自動發一條任務消息給MQ,或者人工配置指定的航線定時更新,Job也會自動發送任務消息給MQ,前臺和后臺的消息被服務消費以實現數據的更新。用戶的不斷請求和后臺指定的任務,保證數據的持續更新,時間越久數據的準確性越高,用戶查詢的命中率也會越來越高。

四、緩存策略與數據一致

上面說到運價數據同時存儲在數據庫和緩存,為什么有了緩存還要數據庫呢?存儲到數據庫是為了方便數據的多維查詢和管理,包括對緩存的進一步干預。數據庫查詢的功能強大,但速度慢,緩存的性能好,但從緩存里獲取的數據,會有不準確的問題。怎么才能做到查詢快而且數據準呢?我們的解決方法是緩存永不失效、數據分類、自主控制更新頻率,以實現運價數據的又快又準。

我們根據航線查詢的頻率,將可以分成熱門數據、冷門數據和沒有數據,航班多、查詢多的是熱門數據,航班少、查詢少的是冷門數據,查詢不到就是沒有數據。在預加載或更新運價數據時,將緩存設置為一個較長時間或永不過期,然后在前臺訪問時,不同數據類型采用不同的更新策略,具體如下:

  • 熱門航線查詢,在緩存中獲取數據,數據中有一個自己的緩存時間字段,然后根據這個時間來分別處理:
  • 1小時之內更新的:新鮮度較高,可以直接用;
  • 1-6小時之內更新的:預警n次,第n+1次命中時則異步更新運價;
  • 6小時之外更新的:新鮮度太低,異步更新運價;
  • 冷門航線查詢,與熱門航線一樣,只是不預加載且緩存時間稍長:
  • 12個小時之內更新的:新鮮度較高,可以直接用;
  • 12-48個小時之內更新的:預警n次,第n+1次命中時則異步更新運價;
  • 48個小時之外更新的:新鮮度太低,異步更新運價;
  • 緩存沒有數據時,直接獲取最新運價,同時更新數據庫和緩存。

以上無論是預警后更新還是直接更新,都是先把緩存中數據返回給用戶,同時異步更新數據庫和緩存。雖然有存在數據查詢不準確的概率,但被用戶再次查詢時就準確了。查詢到的數據即便不準確,在后繼的航班預訂時也會二次的驗艙驗價,運價數據和庫存數據會再次更新。用戶不斷地查詢,數據不斷地更新,查詢命中率就會越來越高,并且用的人越多情況會越好,會逐步趨近于n個9。

五、實時查詢與三段超時

能靜態化的數據我們要盡量靜態化,但遠端數據的實時查詢還是必不可少。實時查詢如何做到又快又好呢,特別是多數據源、多供應商的實時查詢場景。我們的國際機票查詢就是這樣,前臺頁面點擊查詢時實時調用供應商接口,早期我們僅調用一個供應接口,產品比較單一,數據不夠豐富,后面我們引入了多供應商,產品變豐富了,也有了低價,但同時帶來了很多新問題,比如供應端接口需要20~30秒,但前端客戶只能接受8秒以內,怎么辦?提高供應數據門檻?但這不是核心競爭。還有查詢速度變慢、外部數據源不可控、數據格式多樣等問題。

對于以上問題,我們的解決辦法是三段超時,所謂三段超時,即供應端、運營端和客戶端。前端滿足客人、中間滿足運營控制策略、后端滿足供應商,三方都要滿意,這樣才能產品更豐富、價格更低、運營策略更靈活、用戶響應更及時。三段超時的時間可以根據具體場景進行配置,具體如下:

  • 供應端超時:供應端是后端,是指提供數據源的一方,供應端存在的問題就是外部不可控。供應端處于數據來源的最底端,解決辦法是盡量加大供應端的超時時間限制。我們對請求供應接口的最大HTTP超時時間設置為45秒,這個值可以滿足絕大部分情況。
  • 運營端超時:運營端是中間端,把供應商的數據拿過來之后,做包裝轉換、去重、政策匹配等業務處理。我們先統計每一個供應接口的請求時間,確認供應接口數據的質量和優先級,比如說:A供應數據的質量相比B和C供應數據的質量要高,那么A的請求級別可以設置得高一些。我們優先考慮拿到A供應的數據,如果A的數據在8秒就返回,而B和C的超過這個時間,那么我們此時在前臺就只把A的數據返回給客戶。對于B和C的數據,由于在HTTP請求時我們采用異步并設置了較大的供應端超時,所以它會在A返回之后,繼續異步請求并將返回的數據保存到緩存中,以供用戶下次或其他用戶使用。當我們拿到了多供應商的產品數據后,這時會有一定重復的數據,需要規范化處理,將不同數據格式轉換成統一標準,然后去重并選取最優,最后根據運營策略進行政策匹配等。
  • 客戶端超時:客戶端是前端,需要處理最終展示和不同終端用戶的不同需求。客戶端采用多線程異步讀取,這樣不會影響主線程的速度,同時并發請求,提升響應速度和用戶體驗。這里指的主線程請求時間,可以理解為在前臺終端設備需要等待的時間,比如APP要求8秒鐘返回,那就設置8秒時間;如果PC端B2B白屏網頁查詢,客戶可以等待時間為25秒,那么就是設置25秒。客戶端的超時時間要大于或等于所有的運營端超時時間,例如客戶端超時是25秒,那么運營端線程A的超時可以最大為25秒,但如果線程A的絕大部分航線獲取時間是18秒,那么線程B和C的超時最好不要超過18秒,這里的用戶體驗要綜合考慮概率問題。
六、政策匹配與算法優化

弄來這么多產品,不可能都提供給客人,需要根據運營規則來匹配。機票政策就是機票產品的運營控制策略,如上圖所示,包括政策類型、客戶類型、航程類型、乘客類型、航司、航班、艙位、城市、日期、返點 、定額、Office號等多種屬性。為什么有這么多屬性呢?因為機票產品的運營規則很復雜,而這種規則的復雜性,直接導致在航班查詢的時候,機票政策的匹配也很復雜的。對于這種大數據、復雜業務規則的數據處理,需要有一套專門的政策匹配算法,具體如下:

第一步是直接從數據庫查政策,在前端查詢的時候,根據查詢的條件,如出發到達城市、日期等,從數據庫中大范圍的獲取政策數據,并把這些數據放到內存中。第二步在內存中對每個產品進行政策匹配即過濾,先將每一個屬性轉化為業務規則如限制城市、排除供應商、航司指定供應商等,一個屬性一個類、采用統一的接口,然后增加到政策過濾器中。產品與政策的匹配過程,就像水流過過濾網一樣,把最優政策應用到產品上如調整價格。這個過程有些復雜,為此我們編寫了一套自己的政策過濾器PolicyFilter框架。第三步是按照政策返點高低進行排序。第四步是將最優政策返回給前臺。以下是部分核心代碼的演示:

七、小結

機票垂直搜索性能優化不僅僅適合于機票行業,也適合于其它垂直行業,在垂直搜索引擎方面有一定的通用性,只要它存在:遠端數據獲取、靜態數據、緩存更新、規則匹配、多數據源等問題,都是類似解決方案。垂直搜索主要有四把刷子。第一把刷子是靜態數據與任務打底。第二把刷子是緩存與更新,保持數據的新鮮度,不僅要快,還要準。第三把刷子是實時查詢與三段超時,多供應商多數據源,供應商要20秒,客戶只能接受3秒,怎么辦?解決辦法是三段超時。第四刷子是政策匹配,好不容易弄來這么多產品,不可能都直接顯示給客人,需要根據運營規則進行匹配。以上,每一個具體的技術可能并不復雜,但把它們綜合起來,解決具體的實際問題,為公司為行業帶來價值,并不是件容易的事。技術的核心價值在于技術的應用,技術價值要借助技術應用和產品才能發揮出來,這比單純的技術學習要有意思得多,希望以上能應用到你具體的工作中。

?

posted on 2019-02-13 15:00 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/10369891.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395184.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395184.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395184.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2015國內征信機構大數據整合能力對比

自2001年起,大陸地區現代企業征信業進入在競爭中發展的階段,信用問題開始得到社會各界的廣泛關注,許多政府和民間投資的企業征信機構攜帶大量資本如雨后春筍般出現。 隨著企業征信行業環境不斷改善,信息透明度低的問題日益凸顯。大…

Unity3D 裝備系統學習Inventory Pro 2.1.2 基礎篇

前言 前一篇 Unity3D 裝備系統學習Inventory Pro 2.1.2 總結 基本泛泛的對于Inventory Pro 這個插件進行了講解,主要是想提煉下通用裝備系統結構和類體系。前兩天又讀了另一個插件 C# Inventory-uGui v2.0.1的源碼(應該也是老外寫的)&#xf…

Java項目問題_Java項目出現的問題01----學習

0 運行環境MyEcplise2016Tomcat8.01今天在html的表格提交跳轉時發現,想要提交到自己寫servlet程序中,卻發現總是出錯http://localhost:8080/Test4/Test4/fail.html多出一個項目路徑/Test4,但是程序沒有任何問題,最后發現是在Ecpli…

express-cli入門_使用Express.js入門

express-cli入門by Victor Ofoegbu由Victor Ofoegbu 使用Express.js入門 (Getting off the ground with Express.js) 使用Node.js框架編寫Web應用 (Writing web apps with the Node.js framework) A common moment of truth is when you develop a lot of applications that n…

《瘋狂前端開發講義jQuery+Angular+Bootstrap前端開發實踐》學習筆記

《瘋狂前端開發講義jQueryAngularBootstrap前端開發實踐》學習筆記 二〇一九年二月十三日星期三2時28分54秒 前提:本書適合有初步HTML、CSS、JavaScript基礎的讀者,或對企業應用前端開發不太熟悉的開發人員。 第1章:前端開發與Ajax技術 要點&…

混合云:公共云和私有云之間取得平衡的方式?

在可預見的未來,混合云是現實的,但真正的收獲是試圖找出企業最終朝向公共或私人資源是否平衡。 你在與任何技術供應商溝通時,也許會涉及到數據中心,但大多會提到云計算的三種方式:私有云,公共云&#xff0c…

騰騰流氓,云云更流氓(問微信怎樣接入支付寶支付),手賤的趕緊點,你會感謝我的...

草原上的兩匹馬! 打從當年微信開始布局公眾號之初時,估計就已經想到了與支付寶正面沖突的場面,所以微信先來個瞞天過海,在春晚搞了個微信紅包,那叫一個火呀,此時的云云隱隱感覺到些許不安。 早期的微信開發…

java中的string是什么_什么是String

2017-07-28String和StringBufString namenew String("HuangWeiFeng");System。out。println(name"is my name");看似已經很精簡了,其實并非如此。為了生成二進制的代碼,要進行如下的步驟和操作:(1) 生成新的字符串 new S…

詳解華為與三星專利之爭 律師稱可能會打持久戰

華為技術有限公司(下稱“華為”)起訴三星,在近期中國企業起訴外企的“潮流”中掀起不小的漩渦。 “叫好聲”認為,這是已經擁有專利積累的中國企業在國際舞臺上的一次“實力亮相”,這件事本身就是中國制造業的勝利;“陰謀論者”認為…

租金 預測_如何預測租金并優化租賃期限,從而節省資金

租金 預測by Zhen Liu劉震 如何預測租金并優化租賃期限,從而節省資金 (How to Predict Rent and Optimize Your Lease Duration So You Can Save Money) In my last post, we talked about how to pick the best month to sign the lease based on seasonality. No…

java system load_關于java的System.load 和 System.loadLibrary

關于兩者的區別(參見http://blog.csdn.net/ring0hx/article/details/3242245)System.load 參數為庫文件的絕對路徑,可以是任意路徑。System.loadLibrary方法load的為相對路徑,即在java.library.path定義下的lib文件,文件名會更具不同的系統實…

東進技術南亞創捷

深圳市東進技術在其海外市場拓展中取得又一驕人戰績,于四月下旬與印度One97通信公司簽訂了長期戰略合作協議,One97將全面采用東進的全系列產品。同時簽訂的一期采購計劃,總裝機端口數約3萬線。該合約主要涉及東進技術的領先主打產品——Keygo…

如何在5分鐘內通過身份驗證構建RESTful API —全部從命令行(第1部分)

by Niharika Singh由Niharika Singh 如何在5分鐘內通過身份驗證構建RESTful API —全部從命令行(第1部分) (How to Build a RESTful API with Authentication in 5 minutes — all from your command line (Part 1)) If the title of this article excites you, then my frien…

MD5與SHA1

一、MD5 MD5消息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16字節)的散列值(hash value),用于確保信…

java基本類型的默認值及其取值范圍

轉載于:https://www.cnblogs.com/billyu/p/5843845.html

tair client java_TFS(Taobao File System)Java Client 使用經驗

TFS Java客戶端的說明tfs-client-java版本選擇:---------------------------------------tfs-client-java的版本有:release-2.0.0/tfs-with-large-2.1.1/tfs-client-java-2.1.3/release-2.2.2/release-2.2.3/release-2.2.4/release-2.2.6/最終我選用了tf…

Nutanix公布財報數據 準備IPO前表現搶眼

Nutanix已經向美國證券交易委員會提交了修訂的S-1 IPO文件,其中的數據顯示,Nutanix憑借著強力增長的業務為IPO做好了準備。 Nutanix公布財報數據 準備IPO前表現搶眼 Nutanix CEO Dheeraj Pandey Nutanix最新的財報數據無論從環比和同比收入增長方面看起來…

DevExpress WinForms使用教程:圖表控件 - 內置深入查詢

【DevExpress WinForms v18.2下載】在最新發布的DevExpress WinForms v18.2中,DevExpress WinForms和ASP.NET圖表控件引入嵌套系列模板的概念,是您能在不編寫自定義代碼的情況下深入查詢圖表。 Chart控件的嵌入式痕跡導航元素顯示導航層次結構中各個數據…

serverless 構建_使用Serverless,StepFunctions和StackStorm Exchange構建社區注冊應用程序-Episode…...

serverless 構建by Dmitri Zimine由Dmitri Zimine 使用Serverless,StepFunctions和StackStorm Exchange構建社區注冊應用程序-第3集 (Building a community sign-up app with Serverless, StepFunctions, and StackStorm Exchange — Episode 3) Build a real-worl…

AlfaLaval公司采用低速通風技術冷卻數據中心

日前,瑞典熱交換專家AlfaLaval公司推出了遵循低速通風原則的一系列數據中心冷卻解決方案,其方案需要大量的風扇,而使空氣以相當慢的速度流動,取得了與計算機機房空調(CRAC)一樣有效的制冷效果。 該公司表示…