58到家入駐微信錢包的技術優(yōu)化

2018-09-06 17:56 更新

一、需求緣起

大伙打開微信錢包,會發(fā)現(xiàn)58到家入駐了微信錢包的一級入口(如下圖),這個入口流量極大,微信要求被接入的H5必須能抗住n萬的qps(58到家的系統(tǒng)是偏交易的系統(tǒng),雖然一天100w訂單其實也沒多少請求),這是之前的業(yè)務系統(tǒng)沒有遇到過的,要抗住這個n萬的qps的優(yōu)化思路是怎么樣的呢?

58到家入駐微信錢包
這里做一個思路分享,希望能對業(yè)界同仁有啟示作用。

二、業(yè)務分析

在微信錢包里,點擊進入58到家,會發(fā)現(xiàn)其實是一個類別落地頁,根據(jù)不同城市開通的服務類別,展示不同類別的入口(如下圖)。

不同城市開通的服務類別
很容易想到,整個架構與流程是這樣滴:
微信端架構流程1

架構分層:

(1)微信錢包端,嵌有到家H5頁面

(2)web-server層,生成H5頁面

(3)service層,提供“城市開通了哪些核心服務”的接口

(4)數(shù)據(jù)庫層,存儲了“城市開通了哪些核心服務”的數(shù)據(jù)

核心流程:

步驟一:微信端通過native的GPS定位或者微信的js-sdk獲取用戶當前所在城市,并往web-server發(fā)送http請求

步驟二:web-server收到http請求,調用service層,獲取當前城市開通了哪些核心服務的數(shù)據(jù),以瓶裝返回html

步驟三:service收到RPC請求,調用mysql,獲取真正的數(shù)據(jù)

步驟四:mysql返回service,service返回web-server,web-server拼裝html,返回微信錢包


潛在的問題

每秒鐘n萬的qps數(shù)據(jù)庫扛不住


三、優(yōu)化分析

看到這里,很多讀者就笑了,這個場景加個緩存不就搞定了么,好吧,是可以,但本文的重點并不是加一個緩存,還有其他的梗等著你。


場景分析:這個“城市開通了哪些核心服務”是一個幾乎只讀的場景,因為城市要開通新的服務是很低頻的,所以一大早就想到了cache的優(yōu)化(cache要注意高可用),優(yōu)化后的架構分層如下:
微信端架構流程2

cache存儲城市開通的核心服務列表,key value建立的是一個city-id到list<service-id>的映射關系。

幾乎100%的請求會命中緩存。


潛在的問題服務與緩存之間的帶寬會不會成為瓶頸呢?

因為幾乎是只讀的請求,很容易想到將分布式緩存優(yōu)化為服務內(nèi)存緩存,優(yōu)化后的架構分層如下:

微信端架構流程3
每一個服務內(nèi)部都有一個map,存儲city-id到list<service-id>的映射關系,而不用通過cache來讀取數(shù)據(jù)。

還能不能進一步優(yōu)化,例如進一步降低網(wǎng)絡交互呢?

是可以的,服務層可以做數(shù)據(jù)的緩存map<cityid, list<sid>>,web-server層可以進一步做頁面緩存優(yōu)化,架構圖如下:

web-server層頁面緩存優(yōu)化
每一個站點層,直接做頁面緩存,上游傳入一個city-id,就直接將提前拼裝好的頁面返回,得到很高的性能。

有甚者,通過nginx/varnish/squid針對性的做一些“頁面靜態(tài)化的優(yōu)化”,直接每個city有一個對應的html,能極大的提高吞吐量: 
web-server層頁面靜態(tài)化

四、頁面靜態(tài)化的適用場景

在做站點架構的過程中,“動靜分離”是一項很常見的優(yōu)化手段:

(1)對于不變的首頁、js、jpg、css,可以用專門的file-server來針對性優(yōu)化(cdn/nginx/varnish/squid)提供高速訪問

(2)對于動態(tài)的頁面,有專門的tomcat/apache/iis/lighttpd集群來提供動態(tài)站點生成

一般來說動態(tài)站點時延會大大高于靜態(tài)站點,應為每次生成動態(tài)站點需要訪問服務(多次網(wǎng)絡傳輸)、訪問數(shù)據(jù)庫(可能有很慢的磁盤io),并且還有大量的計算邏輯,而靜態(tài)文件則可以直接返回。


“頁面靜態(tài)化”是一種將原本需要動態(tài)生成的站點提前生成靜態(tài)站點的優(yōu)化技術,什么樣的業(yè)務場景可以進行“頁面靜態(tài)化”優(yōu)化呢?

解答:總數(shù)據(jù)量不大,生成靜態(tài)頁面數(shù)量不多的業(yè)務,非常適合于“頁面靜態(tài)化”優(yōu)化


例如:到家開通的城市只有幾百個,那只需提前生成幾百個城市的“靜態(tài)化頁面”即可

又例如:一些二手車業(yè)務,整個公司可能只有幾萬量二手車庫存,也可以提前生成這幾萬量二手車的靜態(tài)頁面

再例如:像58同城這樣的信息模式業(yè)務,又幾十億的帖子量,就不太適合于靜態(tài)化


五、總結

“頁面靜態(tài)化”是一種將原本需要動態(tài)生成的站點提前生成靜態(tài)站點的優(yōu)化技術,總數(shù)據(jù)量不大,生成靜態(tài)頁面數(shù)量不多的業(yè)務,非常適合于“頁面靜態(tài)化”優(yōu)化


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號