?
<!-- more -->
## 需求
每个用户都希望看到列表页的价格和详情页的价格是一致的,最后也能订到自己看到的这个价格(除了苛捐杂税之外)。这个逻辑非常简单平实,不需要多讲道理。那么,对于酒店来说,解决这个需求很简单,只要看看自己家还有没有空房间即可,但对于我们这样的平台来说,就比较复杂了,因为我们需要大规模遍历所有酒店去检查用户需要的放房间是否可得,因此,会产生数量巨大的查询次数。
## 矛盾
上面需求导致的查询次数经常会让各个酒店以及酒店代理无法忍受,为什么呢,下面我引用腾芳的话:
|`问题就是覆盖日期范围,抓取连住日期,调度周期,和qps限制总有一个维度是冲突的`<br><br>`如果想要覆盖强抓更多的范围和连住日期,,在同样的周期下,qps就要更高`<br><br>`按昨天说的一个20w酒店的wrapper,``30``天范围,``3``个连住,``2``个小时的周期,那么计算的不限制的qps就是`<br><br>`(20w *` `30` `*` `3` `)/(``3600` `*` `2``) =` `2500` `qps`|
大致的意思是:我们如果需要在合理的时间范围内获取足够的各种组合(不同供应商、不同连住天数、N 个酒店)的报价信息,其实就是一个 [笛卡尔积](笛卡尔积.md),在有限时间完成这个笛卡尔积势必会导致巨大的查询量,因此也对自己和供货方造成巨大的压力。
## 解决思考
### 思考过程
解决问题的思路无非两种:
[MVP](MVP.md): `(20w *` `30` `*` `3` `)/(``3600` `*` `2``) =` `2500` `qps` 去主动全量更新查询
1. 对方有变价的时候通知我们,用事件的方式被动更新
- 不一定可以 100% 获得
- 受制于人
2. 优化这个笛卡尔积,减少可能的查询,把好钢用在刀刃上
方案 2 的优点是自主可控,但是如何能优化好需要很多思考,以及一些数学和统计学的知识。
我们这里仔细想想方案 2 我们能做什么?
我们抬头看看那个笛卡尔积:20w 酒店 * 30 天范围 * 3 个连住 * 2 小时以内。
其实这个公式每一个环节我们都可以思考一遍:
1. 20w 酒店都每时每刻频繁变更么?
2. 我们的用户一定是提前 30 天看各种信息么?
3. 不管怎样用户都会关注 3 个连住日期么?
4. 是否所有以上组合都有必要在 2 小时内完成?
### 如何选择重点酒店
人们的需求会因为需求的不同而不同,对于国际酒店,最常见的不同需求,就是因为假期长短导致的出行目的地的不同,而不同出行目的地,必然有不同的提前量。所以一个很逻辑的思考方法就是对用户的需求针对性地看看不同目的地、不同季节时段的酒店、连住、供应商变价的特点,那么基本就是:
1. 统计最近 3 个月、6 个月成交订单的住宿天数,按照目的地 group by
2. group by 目的地(城市), 连住天数—按照目的地、连住天数进行分组统计
3. 再细分就是加一个 时间维度,差不多是春节(1~2 月)、暑假(7~8 月),这个维度可以扩展成根据我们节假日的长短来抽象
这个思路我们可以这么认为,因为是一个笛卡尔积,那么我们如果每个环节只能节约 20% 出来,那么三四个环节也会导致接近 85% 的节约!这个是正常逻辑可以得出的,那么保守点,我们提升 50% 的效率,也就意味着我们可以把变价率降低接近 1/3!(1/1.5)
## 分析数据
OK,原理很美好,现实如何呢?这个是需要挑战和质疑的,所以从看数据开始
### 第一个基础分析
| |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `国家,城市,单量,提前预定天数,连住天数`<br><br>`德国,dortmund_arn,``2``,``37.0``,``7.0`<br><br>`英国,leicester,``1``,``3.0``,``7.0`<br><br>`加拿大,markham,``1``,``10.0``,``6.0`<br><br>`澳大利亚,noble_park_vic,``1``,``6.0``,``6.0`<br><br>`加拿大,laval_lav,``1``,``2.0``,``4.0`<br><br>`美国,maui_county,``1``,``1.0``,``4.0`<br><br>`俄罗斯,nizhny_novgorod,``1``,``13.0``,``4.0`<br><br>`美国,johnson_ia,``1``,``1.0``,``4.0`<br><br>`美国,orange_county,``2``,``1.5``,``4.0`<br><br>`加拿大,dorval,``1``,``16.0``,``4.0`<br><br>`美国,montgomery_pa,``2``,``27.0``,``3.5`<br><br>`加蓬,libreville,``5``,``0.2``,``3.4`<br><br>`菲律宾,laoag_city,``1``,``12.0``,``3.0`<br><br>`澳大利亚,hobart_tas_au,``2``,``2.0``,``3.0`<br><br>`加纳,accra_acc,``1``,``1.0``,``3.0`<br><br>`葡萄牙,faro_district,``1``,``5.0``,``3.0`<br><br>`菲律宾,bohol_visayas,``4``,``38.75``,``3.0`<br><br>`马来西亚,pahang,``1``,``0.0``,``3.0`<br><br>`美国,wayne_mi_us,``1``,``12.0``,``3.0`<br><br>`澳大利亚,perth_wa,``3``,``10.33``,``3.0`<br><br>`马耳他,sliema,``1``,``28.0``,``3.0`<br><br>`日本,nakagami_district,``1``,``15.0``,``3.0`<br><br>`新西兰,wellington_wel,``1``,``1.0``,``3.0`<br><br>`法国,nice_alp,``2``,``6.0``,``2.5`<br><br>`越南,lao_cai_vn,``2``,``0.0``,``2.5`<br><br>`日本,toyama_toy,``2``,``33.0``,``2.5`<br><br>`美国,orange_fl,``14``,``26.93``,``2.43`<br><br>`澳大利亚,cairns_qld,``11``,``11.82``,``2.27`<br><br>`美国,multnomah_county,``4``,``7.25``,``2.25`<br><br>`加拿大,toronto_tor,``20``,``4.45``,``2.25`<br><br>`墨西哥,mexico_city_d_f,``4``,``16.75``,``2.25`<br><br>`韩国,seoul,``856``,``6.88``,``2.23`<br><br>`美国,harris_tx,``5``,``1.8``,``2.2`<br><br>`日本,naha,``49``,``20.67``,``2.18`<br><br>`波兰,warsaw_war,``7``,``2.71``,``2.14`<br><br>`关岛,guam,``4``,``6.5``,``2.0`<br><br>`美国,franklin_oh_us,``1``,-``1.0``,``2.0`<br><br>`澳大利亚,albany_wa_au_aus,``1``,``12.0``,``2.0`<br><br>`摩洛哥,marrakesh,``2``,``3.0``,``2.0`<br><br>`罗马尼亚,bucharest,``1``,``4.0``,``2.0`<br><br>`土耳其,izmir_izm,``2``,``14.5``,``2.0`<br><br>`泰国,ko_li_pe,``4``,``33.25``,``2.0`<br><br>`英国,milton_keynes_eng,``1``,``0.0``,``2.0`<br><br>`蒙古,ulaanbaatar,``1``,``45.0``,``2.0`<br><br>`墨西哥,leon,``1``,``7.0``,``2.0`<br><br>`阿根廷,buenos_aires,``2``,``0.5``,``2.0`<br><br>`意大利,como,``1``,``24.0``,``2.0`<br><br>`印度尼西亚,yogyakarta_city,``2``,``16.5``,``2.0`<br><br>`菲律宾,busuanga_island,``1``,``4.0``,``2.0`<br><br>`荷兰,government_of_amsterdam,``4``,``4.5``,``2.0`<br><br>`印度尼西亚,surakarta,``1``,``1.0``,``2.0`<br><br>`中国,keelung,``1``,``1.0``,``2.0`<br><br>`土耳其,fethiye,``2``,``0.5``,``2.0`<br><br>`黎巴嫩,beirut_bei,``1``,``9.0``,``2.0`<br><br>`柬埔寨,poipet_ou,``1``,``1.0``,``2.0`<br><br>`奥地利,salzburg_sal,``1``,``16.0``,``2.0`<br><br>`美国,kent_mi,``1``,``7.0``,``2.0`<br><br>`马来西亚,perak,``3``,``75.0``,``2.0`<br><br>`日本,kumamoto_kum,``2``,``16.0``,``2.0`<br><br>`摩洛哥,essaouira_mar,``1``,``2.0``,``2.0`<br><br>`俄罗斯,perm,``1``,``7.0``,``2.0`<br><br>`美国,benton_county_or,``1``,``0.0``,``2.0`<br><br>`美国,mecklenburg_nc,``1``,``0.0``,``2.0`<br><br>`西班牙,granada_al,``1``,``1.0``,``2.0`<br><br>`哈萨克斯坦,almaty_tal,``1``,``0.0``,``2.0`<br><br>`美国,ca_rowlandheights,``1``,``3.0``,``2.0`<br><br>`日本,shimajiri_district,``1``,``11.0``,``2.0`<br><br>`英国,kent_eng,``1``,``1.0``,``2.0`<br><br>`意大利,florence,``8``,``11.5``,``2.0`<br><br>`中国,penghu_xian,``3``,``34.0``,``2.0`<br><br>`北马里亚纳群岛,saipan_mnp,``20``,``26.25``,``2.0`<br><br>`菲律宾,coron,``1``,``15.0``,``2.0`<br><br>`美国,jackson_mo_us,``1``,``0.0``,``2.0`<br><br>`捷克,prague_hla,``13``,``18.85``,``2.0`<br><br>`沙特阿拉伯,riyadh_riy,``4``,``6.25``,``2.0`<br><br>`美国,baltimore_md_us,``1``,``0.0``,``2.0`<br><br>`印度尼西亚,magelang,``1``,``9.0``,``2.0`<br><br>`加拿大,niagara_falls_nia,``1``,``10.0``,``2.0`<br><br>`德国,essen_d,``1``,``9.0``,``2.0`<br><br>`印度,jodhpur_rj,``1``,``4.0``,``2.0`<br><br>`美国,ny_brooklyn,``1``,``2.0``,``2.0`<br><br>`菲律宾,baguio_city,``1``,``5.0``,``2.0`<br><br>`美国,iron_county,``1``,``14.0``,``2.0`<br><br>`法属圭亚那,cayenne_gf,``1``,``4.0``,``2.0`<br><br>`加拿大,banff_div,``2``,``1.0``,``2.0`<br><br>`墨西哥,cancun_qroo,``2``,``3.5``,``2.0`<br><br>`塞舌尔,seychelles_sey,``1``,``9.0``,``2.0`<br><br>`印度,ahmedabad_gj,``1``,``3.0``,``2.0`<br><br>`泰国,surat_thani_th,``224``,``15.25``,``1.96`<br><br>`韩国,jeju,``296``,``8.65``,``1.92`<br><br>`日本,tokyo,``507``,``14.62``,``1.92`<br><br>`菲律宾,boracay_philippines,``73``,``17.9``,``1.92`<br><br>`加拿大,vancouver_gre,``11``,``14.18``,``1.91`<br><br>`俄罗斯,st_petersburg_g,``11``,``12.55``,``1.91`<br><br>`法国,paris_city,``53``,``5.13``,``1.89`<br><br>`澳大利亚,brisbane_qld,``18``,``9.22``,``1.89`<br><br>`越南,kien_giang,``16``,``4.69``,``1.88`<br><br>`俄罗斯,moscow_g,``16``,``17.13``,``1.88`<br><br>`泰国,koh_chang_th,``46``,``17.59``,``1.87` |