欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

阿里開(kāi)發(fā)的nosql,阿里開(kāi)發(fā)的搜索引擎

阿里IM技術(shù)分享(六):閑魚(yú)億級(jí)IM消息系統(tǒng)的離線(xiàn)推送到達(dá)率優(yōu)化

本文由阿里閑魚(yú)技術(shù)團(tuán)隊(duì)逸昂分享,原題“消息鏈路優(yōu)化之弱感知鏈路優(yōu)化”,有修訂和改動(dòng),感謝作者的分享。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括交口網(wǎng)站建設(shè)、交口網(wǎng)站制作、交口網(wǎng)頁(yè)制作以及交口網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,交口網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到交口省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!

閑魚(yú)的IM消息系統(tǒng)作為買(mǎi)家與賣(mài)家的溝通工具,增進(jìn)理解、促進(jìn)信任,對(duì)閑魚(yú)的商品成交有重要的價(jià)值,是提升用戶(hù)體驗(yàn)最關(guān)鍵的環(huán)節(jié)。

然而,隨著業(yè)務(wù)體量的快速增長(zhǎng),當(dāng)前這套消息系統(tǒng)正面臨著諸多急待解決的問(wèn)題。

以下幾個(gè)問(wèn)題典型最為典型:

1) 在線(xiàn)消息的體驗(yàn)提升;

2) 離線(xiàn)推送的到達(dá)率;

3) 消息玩法與消息底層系統(tǒng)的耦合過(guò)強(qiáng)。

經(jīng)過(guò)評(píng)估,我們認(rèn)為現(xiàn)階段離線(xiàn)推送的到達(dá)率問(wèn)題最為關(guān)鍵,對(duì)用戶(hù)體驗(yàn)影響較大。

本文將要分享的是閑魚(yú)IM消息在解決離線(xiàn)推送的到達(dá)率方面的技術(shù)實(shí)踐,內(nèi)容包括問(wèn)題分析和技術(shù)優(yōu)化思路等 ,希望能帶給你啟發(fā)。

(本文已同步發(fā)布于: ?)

本文是系列文章的第6篇,總目錄如下:

《 阿里IM技術(shù)分享(一):企業(yè)級(jí)IM王者——釘釘在后端架構(gòu)上的過(guò)人之處 》

《 阿里IM技術(shù)分享(二):閑魚(yú)IM基于Flutter的移動(dòng)端跨端改造實(shí)踐 》

《 阿里IM技術(shù)分享(三):閑魚(yú)億級(jí)IM消息系統(tǒng)的架構(gòu)演進(jìn)之路 》

《 阿里IM技術(shù)分享(四):閑魚(yú)億級(jí)IM消息系統(tǒng)的可靠投遞優(yōu)化實(shí)踐 》

《 阿里IM技術(shù)分享(五):閑魚(yú)億級(jí)IM消息系統(tǒng)的及時(shí)性?xún)?yōu)化實(shí)踐 》

《 阿里IM技術(shù)分享(六):閑魚(yú)億級(jí)IM消息系統(tǒng)的離線(xiàn)推送到達(dá)率優(yōu)化 》(* 本文)

從數(shù)據(jù)通信鏈接的技術(shù)角度,我們根據(jù)閑魚(yú)客戶(hù)端是否在線(xiàn),將整體消息鏈路大致分為強(qiáng)感知鏈路和弱感知鏈路。

強(qiáng)感知鏈路由以下子系統(tǒng)或模塊:

1) 發(fā)送方客戶(hù)端;

2) idleapi-message(閑魚(yú)的消息網(wǎng)關(guān));

3) heracles(閑魚(yú)的消息底層服務(wù));

4) accs(阿里自研的長(zhǎng)連接通道);

5) 接收方客戶(hù)端組成。

整條鏈路的核心指標(biāo)在于端到端延遲和消息到達(dá)率。

強(qiáng)感知鏈路中的雙方都是在線(xiàn)的,消息到達(dá)客戶(hù)端就可以保證接收方感知到。強(qiáng)感知鏈路的主要痛點(diǎn)在消息的端到端延遲。

弱感知鏈路與強(qiáng)感知鏈路的主要不同在于: 弱感知鏈路的接收方是離線(xiàn)的,需要依賴(lài)離線(xiàn)推送這樣的方式送達(dá)。

因此弱感知鏈路的用戶(hù)感知度不強(qiáng),其核心指標(biāo)在于消息的到達(dá)率,而非延遲。

所以當(dāng)前階段,優(yōu)化弱感知鏈路的重點(diǎn)也就是提升離線(xiàn)消息的到達(dá)率。換句話(huà)說(shuō), 提升離線(xiàn)消息到達(dá)率問(wèn)題,也就是優(yōu)化弱感知鏈路本身 。

下圖一張整個(gè)IM消息系統(tǒng)的架構(gòu)圖,感受下整體鏈路:

如上圖所示,各主要組件和子系統(tǒng)分工如下:

1) HSF是一個(gè)遠(yuǎn)程服務(wù)框架,是dubbo的內(nèi)部版本;

2) tair是阿里自研的分布式緩存框架,支持 memcached、Redis、LevelDB 等不同存儲(chǔ)引擎;

3) agoo是阿里的離線(xiàn)推送中臺(tái),負(fù)責(zé)整合不同廠(chǎng)商的離線(xiàn)推送通道,向集團(tuán)用戶(hù)提供一個(gè)統(tǒng)一的離線(xiàn)推送服務(wù);

4) accs是阿里自研的長(zhǎng)連接通道,為客戶(hù)端、服務(wù)端的實(shí)時(shí)雙向交互提供便利;

5) lindorm是阿里自研的NoSQL產(chǎn)品,與HBase有異曲同工之妙;

6) 域環(huán)是閑魚(yú)消息優(yōu)化性能的核心結(jié)構(gòu),用來(lái)存儲(chǔ)用戶(hù)最新的若干條消息。

強(qiáng)感知鏈路和弱感知鏈路在通道選擇上是不同的:

1) 強(qiáng)感知鏈路使用accs這個(gè)在線(xiàn)通道;

2) 弱感知鏈路使用agoo這個(gè)離線(xiàn)通道。

通俗了說(shuō),弱感知鏈路指的就是離線(xiàn)消息推送系統(tǒng)。

相比較于在線(xiàn)消息和端內(nèi)推送(也就是上面說(shuō)的強(qiáng)感知鏈路),離線(xiàn)推送難以確保被用戶(hù)感知到。

典型的情況包括:

1) 未發(fā)送到用戶(hù)設(shè)備:即推送未送達(dá)用戶(hù)設(shè)備,這種情況可以從通道的返回分析;

2) 發(fā)送到用戶(hù)設(shè)備但沒(méi)有展示到系統(tǒng)通知欄:閑魚(yú)曾遇到通道返回成功,但是用戶(hù)未看到推送的案例;

3) 展示到通知欄,并被系統(tǒng)折疊:不同安卓廠(chǎng)商對(duì)推送的折疊策略不同,被折疊后,需用戶(hù)主動(dòng)展開(kāi)才能看到內(nèi)容,觸達(dá)效果明顯變差;

4) 展示到通知欄,并被用戶(hù)忽略:離線(xiàn)推送的點(diǎn)擊率相比于在線(xiàn)推送更低。

針對(duì)“1)未發(fā)送到用戶(hù)設(shè)備”,原因有:

1) 離線(xiàn)通道的token失效;

2) 參數(shù)錯(cuò)誤;

3) 用戶(hù)關(guān)閉應(yīng)用通知;

4) 用戶(hù)已卸載等。

針對(duì)“3)展示到通知欄,并被系統(tǒng)折疊”,原因有:

1) 通知的點(diǎn)擊率;

2) 應(yīng)用在廠(chǎng)商處的權(quán)重;

3) 推送的數(shù)量等。

針對(duì)“4)展示到通知欄,并被用戶(hù)忽略”,原因有:

1) 用戶(hù)不愿意查看推送;

2) 用戶(hù)看到了推送,但是對(duì)內(nèi)容不感興趣;

3) 用戶(hù)在忙別的事,無(wú)暇處理。

總之: 以上這些離線(xiàn)消息推送場(chǎng)景,對(duì)于用戶(hù)來(lái)說(shuō)感知度不高,我們也便稱(chēng)之為弱感知鏈路。

我們的弱感知鏈路分為3部分,即:

1) 系統(tǒng);

2) 通道;

3) 用戶(hù)。

共包含了Hermes、agoo、廠(chǎng)商、設(shè)備、用戶(hù)、承接頁(yè)這幾個(gè)環(huán)節(jié)。具體如下圖所示。

從推送的產(chǎn)生到用戶(hù)最終進(jìn)入APP,共分為如下幾個(gè)步驟:

步驟1 :Hermes是閑魚(yú)的用戶(hù)觸達(dá)系統(tǒng),負(fù)責(zé)人群管理、內(nèi)容管理、時(shí)機(jī)把控,是整個(gè)弱感知鏈路的起點(diǎn)。;

步驟2 :agoo是阿里內(nèi)部承接離線(xiàn)推送的中臺(tái),是閑魚(yú)離線(xiàn)推送能力的基礎(chǔ);

步驟3 :agoo實(shí)現(xiàn)離線(xiàn)推送依靠的是廠(chǎng)商的推送通道(如:蘋(píng)果的 apns通道 、Google的fcm通道、及 國(guó)內(nèi)各廠(chǎng)商的自建通道 。;

步驟4 :通過(guò)廠(chǎng)商的通道,推送最終出現(xiàn)在用戶(hù)的設(shè)備上,這是用戶(hù)能感知到推送的前提條件;

步驟5 :如果用戶(hù)剛巧看到這條推送,推送的內(nèi)容也很有趣,在用戶(hù)的主動(dòng)點(diǎn)擊下會(huì)喚起APP,打開(kāi)承接頁(yè),進(jìn)而給用戶(hù)展示個(gè)性化的商品。

經(jīng)過(guò)以上5個(gè)步驟,至此弱感知鏈路就完成了使命。

弱感知鏈路的核心問(wèn)題在于:

1) 推送的消息是否投遞給了用戶(hù);

2) 已投遞到的消息用戶(hù)是否有感知。

這對(duì)應(yīng)推送的兩個(gè)階段:

1) 推送消息是否已到達(dá)設(shè)備;

2) 用戶(hù)是否查看推送并點(diǎn)擊。

其中: 到達(dá)設(shè)備這個(gè)階段是最基礎(chǔ)的,也是本次優(yōu)化的核心。

我們可以將每一步的消息處理量依次平鋪,展開(kāi)為一張漏斗圖,從而直觀的查看鏈路的瓶頸。

漏斗圖斜率最大的地方是優(yōu)化的重點(diǎn),差異小的地方不需要優(yōu)化:

通過(guò)分析以上漏斗圖,弱感知鏈路的優(yōu)化重點(diǎn)在三個(gè)方面:

1) agoo受理率:是指我們發(fā)送推送請(qǐng)到的數(shù)量到可以通過(guò)agoo(阿里承接離線(xiàn)推送的中臺(tái))轉(zhuǎn)發(fā)到廠(chǎng)商通道的數(shù)量之間的漏斗;

2) 廠(chǎng)商受理率:是指agoo中臺(tái)受理的量到廠(chǎng)商返回成功的量之間的漏斗;

3) Push點(diǎn)擊率:也就通過(guò)以上通道最終已送到到用戶(hù)終端的消息,是否最終轉(zhuǎn)化為用戶(hù)的主動(dòng)“點(diǎn)擊”。

有了優(yōu)化方向,我們來(lái)看看優(yōu)化手段吧。

跟隨推送的視角,順著鏈路看一下我們是如何進(jìn)行優(yōu)化的。

用戶(hù)的推送,從 Hermes 站點(diǎn)搭乘“班車(chē)”,駛向下一站:? agoo 。

這是推送經(jīng)歷的第一站。到站一看,傻眼了,只有不到一半的推送到站下車(chē)了。這是咋回事嘞?

這就要先說(shuō)說(shuō) agoo 了,調(diào)用 agoo 有兩種方式:

1) 指定設(shè)備和客戶(hù)端,agoo直接將推送投遞到相應(yīng)的設(shè)備;

2) 指定用戶(hù)和客戶(hù)端,agoo根據(jù)內(nèi)部的轉(zhuǎn)換表,找到用戶(hù)對(duì)應(yīng)的設(shè)備,再進(jìn)行投遞。

我們的系統(tǒng)不保存用戶(hù)的設(shè)備信息。因此,是按照用戶(hù)來(lái)調(diào)用agoo的。

同時(shí): 由于沒(méi)有用戶(hù)的設(shè)備信息,并不知道用戶(hù)是 iOS 客戶(hù)端還是 Android 客戶(hù)端。工程側(cè)不得不向 iOS 和 Android 都發(fā)送一遍推送。雖然保證了到達(dá),但是,一半的調(diào)用都是無(wú)效的。

為了解這個(gè)問(wèn)題: 我們使用了agoo的設(shè)備信息。將用戶(hù)轉(zhuǎn)換設(shè)備這一階段提前到了調(diào)用 agoo 之前,先明確用戶(hù)對(duì)應(yīng)的設(shè)備,再指定設(shè)備調(diào)用 agoo,從而避免無(wú)效調(diào)用。

agoo調(diào)用方式優(yōu)化后,立刻剔除了無(wú)效調(diào)用,agoo受理率有了明顯提升。

至此: 我們總算能對(duì) agoo 受理失敗的真正原因做一個(gè)高大上的分析了。

根據(jù)統(tǒng)計(jì): 推送被 agoo 拒絕的主要原因是——用戶(hù)關(guān)閉了通知權(quán)限。同時(shí),我們對(duì) agoo 調(diào)用數(shù)據(jù)的進(jìn)一步分析發(fā)現(xiàn)——有部分用戶(hù)找不到對(duì)應(yīng)的設(shè)備。 優(yōu)化到此,我們猛然發(fā)現(xiàn)多了兩個(gè)問(wèn)題。

那就繼續(xù)優(yōu)化唄:

1) 通知體驗(yàn)優(yōu)化,引導(dǎo)打開(kāi)通知權(quán)限;

2) 與agoo共建設(shè)備庫(kù),解決設(shè)備轉(zhuǎn)換失敗的問(wèn)題。

這兩個(gè)優(yōu)化方向又是一片新天地,我們擇日再聊。

推送到達(dá) agoo ,分機(jī)型搭乘廠(chǎng)商“專(zhuān)列”,駛向下一站:用戶(hù)設(shè)備。

這是推送經(jīng)歷的第二站。出站查票,發(fā)現(xiàn)竟然超員了。

于是乎: 我們每天有大量推送因?yàn)槌^(guò)廠(chǎng)商設(shè)定的限額被攔截。

為什么會(huì)這樣呢?

實(shí)際上: 提供推送通道的廠(chǎng)商(沒(méi)錯(cuò), 各手機(jī)廠(chǎng)商的自家推送通道良莠不齊 ),為了保證用戶(hù)體驗(yàn),會(huì)對(duì)每個(gè)應(yīng)用能夠推送的消息總量進(jìn)行限制。

對(duì)于廠(chǎng)商而言,這個(gè)限制會(huì)根據(jù)推送的類(lèi)型和應(yīng)用的用戶(hù)規(guī)模設(shè)定——推送主要分為產(chǎn)品類(lèi)的推送和營(yíng)銷(xiāo)類(lèi)的推送。

廠(chǎng)商推送通道對(duì)于不同類(lèi)型消息的限制是:

1) 對(duì)于產(chǎn)品類(lèi)推送,廠(chǎng)商會(huì)保證到達(dá);

2) 對(duì)于營(yíng)銷(xiāo)類(lèi)推送,廠(chǎng)商會(huì)進(jìn)行額度限制;

3) 未標(biāo)記的推送,默認(rèn)作為營(yíng)銷(xiāo)類(lèi)推送對(duì)待。

我們剛好沒(méi)有對(duì)推送進(jìn)行標(biāo)記,因此觸發(fā)了廠(chǎng)商的推送限制。

這對(duì)我們的用戶(hù)來(lái)說(shuō),會(huì)帶來(lái)困擾。閑魚(yú)的交易,很依賴(lài)買(mǎi)賣(mài)家之間的消息互動(dòng)。這部分消息是需要確保到達(dá)的。

同樣: 訂單類(lèi)的消息、用戶(hù)的關(guān)注,也需要保證推送給用戶(hù)。

根據(jù)主流廠(chǎng)商的接口協(xié)議,我們將推送的消息分為以下幾類(lèi),并進(jìn)行相應(yīng)標(biāo)記:

1) 即時(shí)通訊消息;

2) 訂單狀態(tài)變化;

3) 用戶(hù)關(guān)注內(nèi)容;

4) 營(yíng)銷(xiāo)消息這幾類(lèi)。

同時(shí),在業(yè)務(wù)上,我們也進(jìn)行了推送的治理——將用戶(hù)關(guān)注度不高的消息,取消推送,避免打擾。

經(jīng)過(guò)這些優(yōu)化,因?yàn)槌^(guò)廠(chǎng)商限額而被攔截的推送實(shí)現(xiàn)了清零。

通過(guò)優(yōu)化agoo受理率、廠(chǎng)商受理率,我們解決了推送到達(dá)量的瓶頸。但即使消息被最終送達(dá),用戶(hù)到底點(diǎn)擊了沒(méi)有?這才是消息推送的根本意義所在。

于是,在日常的開(kāi)發(fā)測(cè)試過(guò)程中,我們發(fā)現(xiàn)了推送的兩個(gè)體驗(yàn)問(wèn)題:

1) 用戶(hù)點(diǎn)擊Push有開(kāi)屏廣告;

2) 營(yíng)銷(xiāo)Push也有權(quán)限校驗(yàn),更換用戶(hù)登陸后無(wú)法點(diǎn)擊。

對(duì)于開(kāi)屏廣告功能,我們?cè)黾恿薖ush點(diǎn)擊跳過(guò)廣告的能力。

針對(duì)Push的權(quán)限校驗(yàn)功能,閑魚(yú)根據(jù)場(chǎng)景做了細(xì)分:

1) 涉及個(gè)人隱私的推送,保持權(quán)限校驗(yàn)不變;

2) 營(yíng)銷(xiāo)類(lèi)的推送,放開(kāi)權(quán)限校驗(yàn)。

以上是點(diǎn)擊體驗(yàn)的優(yōu)化,我們還需要考慮用戶(hù)的點(diǎn)擊意愿。

用戶(hù)點(diǎn)擊量與推送的曝光量、推送素材的有趣程度相關(guān)。推送的曝光量又和推送的到達(dá)量、推送的到達(dá)時(shí)機(jī)有關(guān)。

具體的優(yōu)化手段是:

1) 在推送內(nèi)容上:我們需要優(yōu)化的是推送的時(shí)機(jī)和相應(yīng)的素材;

2) 在推送時(shí)機(jī)上:算法會(huì)根據(jù)用戶(hù)的偏好和個(gè)性化行為數(shù)據(jù),計(jì)算每個(gè)用戶(hù)的個(gè)性化推送時(shí)間,在用戶(hù)空閑的時(shí)間推送(避免在不合適的時(shí)間打擾用戶(hù),同時(shí)也能提升用戶(hù)看到推送的可能性)。

3) 在推送素材上:算法會(huì)根據(jù)素材的實(shí)時(shí)點(diǎn)擊反饋,對(duì)素材做實(shí)時(shí)賽馬。只發(fā)用戶(hù)感興趣的素材,提高用戶(hù)點(diǎn)擊意愿。

通過(guò)以上我們的分析和技術(shù)優(yōu)化手段,整體弱推送鏈路鏈路有了不錯(cuò)的提升,離線(xiàn)消息的到達(dá)率相對(duì)提升了兩位數(shù)。

本篇主要和大家聊的是只是IM消息系統(tǒng)鏈路中的一環(huán)——弱感知鏈路的優(yōu)化,落地到到具體的業(yè)務(wù)也就是離線(xiàn)消息送達(dá)率問(wèn)題。

整體IM消息系統(tǒng),還是一個(gè)比較復(fù)雜的領(lǐng)域。

我們?cè)谙⑾到y(tǒng)的發(fā)展過(guò)程中,面臨著如下問(wèn)題:

1) 如何進(jìn)行消息的鏈路追蹤;

2) 如何保證IM消息的快速到達(dá)(見(jiàn)《 閑魚(yú)億級(jí)IM消息系統(tǒng)的及時(shí)性?xún)?yōu)化實(shí)踐 》);

3) 如何將消息的玩法和底層能力分離;

4) 離線(xiàn)推送中如何通過(guò)用戶(hù)找到對(duì)應(yīng)的設(shè)備。

這些問(wèn)題,我們?cè)谝郧暗奈恼轮杏兴窒?,以后也?huì)陸續(xù)分享更多,敬請(qǐng)期待。

[1]? Android P正式版即將到來(lái):后臺(tái)應(yīng)用?;?、消息推送的真正噩夢(mèng)

[2]? 一套高可用、易伸縮、高并發(fā)的IM群聊、單聊架構(gòu)方案設(shè)計(jì)實(shí)踐

[3]? 一套億級(jí)用戶(hù)的IM架構(gòu)技術(shù)干貨(上篇):整體架構(gòu)、服務(wù)拆分等

[4]? 一套億級(jí)用戶(hù)的IM架構(gòu)技術(shù)干貨(下篇):可靠性、有序性、弱網(wǎng)優(yōu)化等

[5]? 從新手到專(zhuān)家:如何設(shè)計(jì)一套億級(jí)消息量的分布式IM系統(tǒng)

[6]? 企業(yè)微信的IM架構(gòu)設(shè)計(jì)揭秘:消息模型、萬(wàn)人群、已讀回執(zhí)、消息撤回等

[7]? 融云技術(shù)分享:全面揭秘億級(jí)IM消息的可靠投遞機(jī)制

[8]? 移動(dòng)端IM中大規(guī)模群消息的推送如何保證效率、實(shí)時(shí)性?

[9]? 現(xiàn)代IM系統(tǒng)中聊天消息的同步和存儲(chǔ)方案探討

[10]? 新手入門(mén)一篇就夠:從零開(kāi)發(fā)移動(dòng)端IM

[11]? 移動(dòng)端IM開(kāi)發(fā)者必讀(一):通俗易懂,理解移動(dòng)網(wǎng)絡(luò)的“弱”和“慢”

[12]? 移動(dòng)端IM開(kāi)發(fā)者必讀(二):史上最全移動(dòng)弱網(wǎng)絡(luò)優(yōu)化方法總結(jié)

[13]? IM消息送達(dá)保證機(jī)制實(shí)現(xiàn)(一):保證在線(xiàn)實(shí)時(shí)消息的可靠投遞

[14]? IM消息送達(dá)保證機(jī)制實(shí)現(xiàn)(二):保證離線(xiàn)消息的可靠投遞

[15]? 零基礎(chǔ)IM開(kāi)發(fā)入門(mén)(一):什么是IM系統(tǒng)?

[16]? 零基礎(chǔ)IM開(kāi)發(fā)入門(mén)(二):什么是IM系統(tǒng)的實(shí)時(shí)性?

[17]? 零基礎(chǔ)IM開(kāi)發(fā)入門(mén)(三):什么是IM系統(tǒng)的可靠性?

[18]? 零基礎(chǔ)IM開(kāi)發(fā)入門(mén)(四):什么是IM系統(tǒng)的消息時(shí)序一致性?

(本文已同步發(fā)布于: ?)

消息中間件(一)MQ詳解及四大MQ比較

一、消息中間件相關(guān)知識(shí)

1、概述

消息隊(duì)列已經(jīng)逐漸成為企業(yè)IT系統(tǒng)內(nèi)部通信的核心手段。它具有低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列功能,成為異步RPC的主要手段之一。當(dāng)今市面上有很多主流的消息中間件,如老牌的ActiveMQ、RabbitMQ,炙手可熱的Kafka,阿里巴巴自主開(kāi)發(fā)RocketMQ等。

2、消息中間件的組成

2.1 Broker

消息服務(wù)器,作為server提供消息核心服務(wù)

2.2 Producer

消息生產(chǎn)者,業(yè)務(wù)的發(fā)起方,負(fù)責(zé)生產(chǎn)消息傳輸給broker,

2.3 Consumer

消息消費(fèi)者,業(yè)務(wù)的處理方,負(fù)責(zé)從broker獲取消息并進(jìn)行業(yè)務(wù)邏輯處理

2.4 Topic

2.5 Queue

2.6 Message

消息體,根據(jù)不同通信協(xié)議定義的固定格式進(jìn)行編碼的數(shù)據(jù)包,來(lái)封裝業(yè)務(wù)數(shù)據(jù),實(shí)現(xiàn)消息的傳輸

3 消息中間件模式分類(lèi)

3.1 點(diǎn)對(duì)點(diǎn)

PTP點(diǎn)對(duì)點(diǎn):使用queue作為通信載體

說(shuō)明:

消息生產(chǎn)者生產(chǎn)消息發(fā)送到queue中,然后消息消費(fèi)者從queue中取出并且消費(fèi)消息。

消息被消費(fèi)以后,queue中不再存儲(chǔ),所以消息消費(fèi)者不可能消費(fèi)到已經(jīng)被消費(fèi)的消息。 Queue支持存在多個(gè)消費(fèi)者,但是對(duì)一個(gè)消息而言,只會(huì)有一個(gè)消費(fèi)者可以消費(fèi)。

說(shuō)明:

queue實(shí)現(xiàn)了負(fù)載均衡,將producer生產(chǎn)的消息發(fā)送到消息隊(duì)列中,由多個(gè)消費(fèi)者消費(fèi)。但一個(gè)消息只能被一個(gè)消費(fèi)者接受,當(dāng)沒(méi)有消費(fèi)者可用時(shí),這個(gè)消息會(huì)被保存直到有一個(gè)可用的消費(fèi)者。

4 消息中間件的優(yōu)勢(shì)

4.1 系統(tǒng)解耦

交互系統(tǒng)之間沒(méi)有直接的調(diào)用關(guān)系,只是通過(guò)消息傳輸,故系統(tǒng)侵入性不強(qiáng),耦合度低。

4.2 提高系統(tǒng)響應(yīng)時(shí)間

例如原來(lái)的一套邏輯,完成支付可能涉及先修改訂單狀態(tài)、計(jì)算會(huì)員積分、通知物流配送幾個(gè)邏輯才能完成;通過(guò)MQ架構(gòu)設(shè)計(jì),就可將緊急重要(需要立刻響應(yīng))的業(yè)務(wù)放到該調(diào)用方法中,響應(yīng)要求不高的使用消息隊(duì)列,放到MQ隊(duì)列中,供消費(fèi)者處理。

4.3 為大數(shù)據(jù)處理架構(gòu)提供服務(wù)

通過(guò)消息作為整合,大數(shù)據(jù)的背景下,消息隊(duì)列還與實(shí)時(shí)處理架構(gòu)整合,為數(shù)據(jù)處理提供性能支持。

4.4 Java消息服務(wù)——JMS

Java消息服務(wù)(Java Message Service,JMS)應(yīng)用程序接口是一個(gè)Java平臺(tái)中關(guān)于面向消息中間件(MOM)的API,用于在兩個(gè)應(yīng)用程序之間,或分布式系統(tǒng)中發(fā)送消息,進(jìn)行異步通信。

5 消息中間件應(yīng)用場(chǎng)景

5.1 異步通信

有些業(yè)務(wù)不想也不需要立即處理消息。消息隊(duì)列提供了異步處理機(jī)制,允許用戶(hù)把一個(gè)消息放入隊(duì)列,但并不立即處理它。想向隊(duì)列中放入多少消息就放多少,然后在需要的時(shí)候再去處理它們。

5.2 解耦

降低工程間的強(qiáng)依賴(lài)程度,針對(duì)異構(gòu)系統(tǒng)進(jìn)行適配。在項(xiàng)目啟動(dòng)之初來(lái)預(yù)測(cè)將來(lái)項(xiàng)目會(huì)碰到什么需求,是極其困難的。通過(guò)消息系統(tǒng)在處理過(guò)程中間插入了一個(gè)隱含的、基于數(shù)據(jù)的接口層,兩邊的處理過(guò)程都要實(shí)現(xiàn)這一接口,當(dāng)應(yīng)用發(fā)生變化時(shí),可以獨(dú)立的擴(kuò)展或修改兩邊的處理過(guò)程,只要確保它們遵守同樣的接口約束。

5.3 冗余

有些情況下,處理數(shù)據(jù)的過(guò)程會(huì)失敗。除非數(shù)據(jù)被持久化,否則將造成丟失。消息隊(duì)列把數(shù)據(jù)進(jìn)行持久化直到它們已經(jīng)被完全處理,通過(guò)這一方式規(guī)避了數(shù)據(jù)丟失風(fēng)險(xiǎn)。許多消息隊(duì)列所采用的”插入-獲取-刪除”范式中,在把一個(gè)消息從隊(duì)列中刪除之前,需要你的處理系統(tǒng)明確的指出該消息已經(jīng)被處理完畢,從而確保你的數(shù)據(jù)被安全的保存直到你使用完畢。

5.4 擴(kuò)展性

因?yàn)橄㈥?duì)列解耦了你的處理過(guò)程,所以增大消息入隊(duì)和處理的頻率是很容易的,只要另外增加處理過(guò)程即可。不需要改變代碼、不需要調(diào)節(jié)參數(shù)。便于分布式擴(kuò)容。

5.5 過(guò)載保護(hù)

在訪(fǎng)問(wèn)量劇增的情況下,應(yīng)用仍然需要繼續(xù)發(fā)揮作用,但是這樣的突發(fā)流量無(wú)法提取預(yù)知;如果以為了能處理這類(lèi)瞬間峰值訪(fǎng)問(wèn)為標(biāo)準(zhǔn)來(lái)投入資源隨時(shí)待命無(wú)疑是巨大的浪費(fèi)。使用消息隊(duì)列能夠使關(guān)鍵組件頂住突發(fā)的訪(fǎng)問(wèn)壓力,而不會(huì)因?yàn)橥话l(fā)的超負(fù)荷的請(qǐng)求而完全崩潰。

5.6 可恢復(fù)性

系統(tǒng)的一部分組件失效時(shí),不會(huì)影響到整個(gè)系統(tǒng)。消息隊(duì)列降低了進(jìn)程間的耦合度,所以即使一個(gè)處理消息的進(jìn)程掛掉,加入隊(duì)列中的消息仍然可以在系統(tǒng)恢復(fù)后被處理。

5.7 順序保證

在大多使用場(chǎng)景下,數(shù)據(jù)處理的順序都很重要。大部分消息隊(duì)列本來(lái)就是排序的,并且能保證數(shù)據(jù)會(huì)按照特定的順序來(lái)處理。

5.8 緩沖

在任何重要的系統(tǒng)中,都會(huì)有需要不同的處理時(shí)間的元素。消息隊(duì)列通過(guò)一個(gè)緩沖層來(lái)幫助任務(wù)最高效率的執(zhí)行,該緩沖有助于控制和優(yōu)化數(shù)據(jù)流經(jīng)過(guò)系統(tǒng)的速度。以調(diào)節(jié)系統(tǒng)響應(yīng)時(shí)間。

5.9 數(shù)據(jù)流處理

分布式系統(tǒng)產(chǎn)生的海量數(shù)據(jù)流,如:業(yè)務(wù)日志、監(jiān)控?cái)?shù)據(jù)、用戶(hù)行為等,針對(duì)這些數(shù)據(jù)流進(jìn)行實(shí)時(shí)或批量采集匯總,然后進(jìn)行大數(shù)據(jù)分析是當(dāng)前互聯(lián)網(wǎng)的必備技術(shù),通過(guò)消息隊(duì)列完成此類(lèi)數(shù)據(jù)收集是最好的選擇。

6 消息中間件常用協(xié)議

6.1 AMQP協(xié)議

AMQP即Advanced Message Queuing Protocol,一個(gè)提供統(tǒng)一消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)高級(jí)消息隊(duì)列協(xié)議,是應(yīng)用層協(xié)議的一個(gè)開(kāi)放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì)。基于此協(xié)議的客戶(hù)端與消息中間件可傳遞消息,并不受客戶(hù)端/中間件不同產(chǎn)品,不同開(kāi)發(fā)語(yǔ)言等條件的限制。

優(yōu)點(diǎn):可靠、通用

6.2 MQTT協(xié)議

MQTT(Message Queuing Telemetry Transport,消息隊(duì)列遙測(cè)傳輸)是IBM開(kāi)發(fā)的一個(gè)即時(shí)通訊協(xié)議,有可能成為物聯(lián)網(wǎng)的重要組成部分。該協(xié)議支持所有平臺(tái),幾乎可以把所有聯(lián)網(wǎng)物品和外部連接起來(lái),被用來(lái)當(dāng)做傳感器和致動(dòng)器(比如通過(guò)Twitter讓房屋聯(lián)網(wǎng))的通信協(xié)議。

優(yōu)點(diǎn):格式簡(jiǎn)潔、占用帶寬小、移動(dòng)端通信、PUSH、嵌入式系統(tǒng)

6.3 STOMP協(xié)議

STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息協(xié)議,是一種為MOM(Message Oriented Middleware,面向消息的中間件)設(shè)計(jì)的簡(jiǎn)單文本協(xié)議。STOMP提供一個(gè)可互操作的連接格式,允許客戶(hù)端與任意STOMP消息代理(Broker)進(jìn)行交互。

優(yōu)點(diǎn):命令模式(非topic\queue模式)

6.4 XMPP協(xié)議

XMPP(可擴(kuò)展消息處理現(xiàn)場(chǎng)協(xié)議,Extensible Messaging and Presence Protocol)是基于可擴(kuò)展標(biāo)記語(yǔ)言(XML)的協(xié)議,多用于即時(shí)消息(IM)以及在線(xiàn)現(xiàn)場(chǎng)探測(cè)。適用于服務(wù)器之間的準(zhǔn)即時(shí)操作。核心是基于XML流傳輸,這個(gè)協(xié)議可能最終允許因特網(wǎng)用戶(hù)向因特網(wǎng)上的其他任何人發(fā)送即時(shí)消息,即使其操作系統(tǒng)和瀏覽器不同。

優(yōu)點(diǎn):通用公開(kāi)、兼容性強(qiáng)、可擴(kuò)展、安全性高,但XML編碼格式占用帶寬大

6.5 其他基于TCP/IP自定義的協(xié)議

有些特殊框架(如:redis、kafka、zeroMq等)根據(jù)自身需要未嚴(yán)格遵循MQ規(guī)范,而是基于TCP\IP自行封裝了一套協(xié)議,通過(guò)網(wǎng)絡(luò)socket接口進(jìn)行傳輸,實(shí)現(xiàn)了MQ的功能。

7 常見(jiàn)消息中間件MQ介紹

7.1 RocketMQ

阿里系下開(kāi)源的一款分布式、隊(duì)列模型的消息中間件,原名Metaq,3.0版本名稱(chēng)改為RocketMQ,是阿里參照kafka設(shè)計(jì)思想使用java實(shí)現(xiàn)的一套mq。同時(shí)將阿里系內(nèi)部多款mq產(chǎn)品(Notify、metaq)進(jìn)行整合,只維護(hù)核心功能,去除了所有其他運(yùn)行時(shí)依賴(lài),保證核心功能最簡(jiǎn)化,在此基礎(chǔ)上配合阿里上述其他開(kāi)源產(chǎn)品實(shí)現(xiàn)不同場(chǎng)景下mq的架構(gòu),目前主要多用于訂單交易系統(tǒng)。

具有以下特點(diǎn):

官方提供了一些不同于kafka的對(duì)比差異:

7.2 RabbitMQ

使用Erlang編寫(xiě)的一個(gè)開(kāi)源的消息隊(duì)列,本身支持很多的協(xié)議:AMQP,XMPP, SMTP,STOMP,也正是如此,使的它變的非常重量級(jí),更適合于企業(yè)級(jí)的開(kāi)發(fā)。同時(shí)實(shí)現(xiàn)了Broker架構(gòu),核心思想是生產(chǎn)者不會(huì)將消息直接發(fā)送給隊(duì)列,消息在發(fā)送給客戶(hù)端時(shí)先在中心隊(duì)列排隊(duì)。對(duì)路由(Routing),負(fù)載均衡(Load balance)、數(shù)據(jù)持久化都有很好的支持。多用于進(jìn)行企業(yè)級(jí)的ESB整合。

7.3 ActiveMQ

Apache下的一個(gè)子項(xiàng)目。使用Java完全支持JMS1.1和J2EE 1.4規(guī)范的 JMS Provider實(shí)現(xiàn),少量代碼就可以高效地實(shí)現(xiàn)高級(jí)應(yīng)用場(chǎng)景??刹灏蔚膫鬏攨f(xié)議支持,比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多種語(yǔ)言客戶(hù)端 C++、Java、.Net,、Python、 Php、 Ruby等。

7.4 Redis

使用C語(yǔ)言開(kāi)發(fā)的一個(gè)Key-Value的NoSQL數(shù)據(jù)庫(kù),開(kāi)發(fā)維護(hù)很活躍,雖然它是一個(gè)Key-Value數(shù)據(jù)庫(kù)存儲(chǔ)系統(tǒng),但它本身支持MQ功能,所以完全可以當(dāng)做一個(gè)輕量級(jí)的隊(duì)列服務(wù)來(lái)使用。對(duì)于RabbitMQ和Redis的入隊(duì)和出隊(duì)操作,各執(zhí)行100萬(wàn)次,每10萬(wàn)次記錄一次執(zhí)行時(shí)間。測(cè)試數(shù)據(jù)分為128Bytes、512Bytes、1K和10K四個(gè)不同大小的數(shù)據(jù)。實(shí)驗(yàn)表明:入隊(duì)時(shí),當(dāng)數(shù)據(jù)比較小時(shí)Redis的性能要高于RabbitMQ,而如果數(shù)據(jù)大小超過(guò)了10K,Redis則慢的無(wú)法忍受;出隊(duì)時(shí),無(wú)論數(shù)據(jù)大小,Redis都表現(xiàn)出非常好的性能,而RabbitMQ的出隊(duì)性能則遠(yuǎn)低于Redis。

7.5 Kafka

Apache下的一個(gè)子項(xiàng)目,使用scala實(shí)現(xiàn)的一個(gè)高性能分布式Publish/Subscribe消息隊(duì)列系統(tǒng),具有以下特性:

7.6 ZeroMQ

號(hào)稱(chēng)最快的消息隊(duì)列系統(tǒng),專(zhuān)門(mén)為高吞吐量/低延遲的場(chǎng)景開(kāi)發(fā),在金融界的應(yīng)用中經(jīng)常使用,偏重于實(shí)時(shí)數(shù)據(jù)通信場(chǎng)景。ZMQ能夠?qū)崿F(xiàn)RabbitMQ不擅長(zhǎng)的高級(jí)/復(fù)雜的隊(duì)列,但是開(kāi)發(fā)人員需要自己組合多種技術(shù)框架,開(kāi)發(fā)成本高。因此ZeroMQ具有一個(gè)獨(dú)特的非中間件的模式,更像一個(gè)socket library,你不需要安裝和運(yùn)行一個(gè)消息服務(wù)器或中間件,因?yàn)槟愕膽?yīng)用程序本身就是使用ZeroMQ API完成邏輯服務(wù)的角色。但是ZeroMQ僅提供非持久性的隊(duì)列,如果down機(jī),數(shù)據(jù)將會(huì)丟失。如:Twitter的Storm中使用ZeroMQ作為數(shù)據(jù)流的傳輸。

ZeroMQ套接字是與傳輸層無(wú)關(guān)的:ZeroMQ套接字對(duì)所有傳輸層協(xié)議定義了統(tǒng)一的API接口。默認(rèn)支持 進(jìn)程內(nèi)(inproc) ,進(jìn)程間(IPC) ,多播,TCP協(xié)議,在不同的協(xié)議之間切換只要簡(jiǎn)單的改變連接字符串的前綴。可以在任何時(shí)候以最小的代價(jià)從進(jìn)程間的本地通信切換到分布式下的TCP通信。ZeroMQ在背后處理連接建立,斷開(kāi)和重連邏輯。

特性:

二、主要消息中間件的比較

NoSQL在少量數(shù)據(jù)的存儲(chǔ)上,與傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)相比有什么劣勢(shì)嗎?

個(gè)人不認(rèn)為nosql在少量數(shù)據(jù)存儲(chǔ)上有啥優(yōu)勢(shì)。nosql主要解決的是auto sharding的問(wèn)題,你不需要sharding,搞啥nosql. 作者:方圓 鏈接:

通過(guò)阿里來(lái)看大型應(yīng)用數(shù)據(jù)庫(kù)是選擇Oracle MySQL 還是 NoSQL

肯定是Oracle,因?yàn)閺暮?jiǎn)單查詢(xún)性能角度來(lái)比較:Oracle MySQL NoSQL,NoSQL 產(chǎn)品不支持 Join,MySQL 的查詢(xún)優(yōu)化器由于所基于的統(tǒng)計(jì)信息相對(duì)少很多,當(dāng)Query 復(fù)雜度很高的時(shí)候容易出現(xiàn)執(zhí)行計(jì)劃不是最優(yōu)選擇的問(wèn)題,而 Oracle 由于大量的統(tǒng)計(jì)信息支持,使得其查詢(xún)優(yōu)化器更為智能,對(duì)復(fù)雜查詢(xún)有更優(yōu)的表現(xiàn)。

阿里云分布式數(shù)據(jù)庫(kù)服務(wù)DRDS?誰(shuí)使用過(guò) 簡(jiǎn)單講講!

淘寶開(kāi)源的TDDL和cobar的結(jié)合,放到了阿里云上就是DRDS,是商品,服務(wù),可以購(gòu)買(mǎi)使用的??梢栽诎⒗镌乒倬W(wǎng)上注冊(cè)免費(fèi)試用。

=====================================================

隨著互聯(lián)網(wǎng)時(shí)代的到來(lái),計(jì)算機(jī)要管理的數(shù)據(jù)量呈指數(shù)級(jí)別地飛速上漲,而我們卻完全無(wú)法對(duì)用戶(hù)數(shù)做出準(zhǔn)確預(yù)估。我們的系統(tǒng)所需要支持的用戶(hù)數(shù),很可能在短短的一個(gè)月內(nèi)突然爆發(fā)式地增長(zhǎng)幾千倍,數(shù)據(jù)也很可能快速地從原來(lái)的幾百GB飛速上漲到了幾百個(gè)TB。如果在這爆發(fā)的關(guān)鍵時(shí)刻,系統(tǒng)不穩(wěn)定或無(wú)法訪(fǎng)問(wèn),那么對(duì)于業(yè)務(wù)將會(huì)是毀滅性的打擊。

伴隨著這種對(duì)于系統(tǒng)性能、成本以及擴(kuò)展性的新需要,以HBase、MongoDB為代表的NoSQL數(shù)據(jù)庫(kù)和以阿里DRDS、VoltDB、ScaleBase為代表的分布式NewSQL數(shù)據(jù)庫(kù)如雨后春筍般不斷涌現(xiàn)出來(lái)。

本文將會(huì)介紹阿里DRDS的技術(shù)理念、發(fā)展歷程、技術(shù)特性等內(nèi)容。

DRDS設(shè)計(jì)理念

從20世紀(jì)70年代關(guān)系數(shù)據(jù)庫(kù)創(chuàng)立開(kāi)始,其實(shí)大家在數(shù)據(jù)庫(kù)上的追求就從未發(fā)生過(guò)變化:更快的存取數(shù)據(jù),可以按需擴(kuò)縮以承載更大的訪(fǎng)問(wèn)量和更大的數(shù)據(jù)量,開(kāi)發(fā)容易,硬件成本低,我們可以把這叫做數(shù)據(jù)庫(kù)領(lǐng)域的圣杯。

為了支撐更大的訪(fǎng)問(wèn)量和數(shù)據(jù)量,我們必然需要分布式數(shù)據(jù)庫(kù)系統(tǒng),然而分布式系統(tǒng)又必然會(huì)面對(duì)強(qiáng)一致性所帶來(lái)的延遲提高的問(wèn)題,因?yàn)榫W(wǎng)絡(luò)通信本身比單機(jī)內(nèi)通信代價(jià)高很多,這種通信的代價(jià)就會(huì)直接增加系統(tǒng)單次提交的延遲。延遲提高會(huì)導(dǎo)致數(shù)據(jù)庫(kù)鎖持有時(shí)間變長(zhǎng),使得高沖突條件下分布式事務(wù)的性能不升反降(這個(gè)具體可以了解一下Amdahl定律),甚至性能距離單機(jī)數(shù)據(jù)庫(kù)都還有明顯的差距。

從上面的說(shuō)明,我們可以發(fā)現(xiàn),問(wèn)題的關(guān)鍵并不是分布式事務(wù)做不出來(lái),而是做出來(lái)了卻因?yàn)樾阅芴疃鴽](méi)有什么卵用。數(shù)據(jù)庫(kù)領(lǐng)域的高手們努力了40年,但至今仍然沒(méi)有人能夠很好地解決這個(gè)問(wèn)題,Google Spanner的開(kāi)發(fā)負(fù)責(zé)人就經(jīng)常在他的Blog上談?wù)撗舆t的問(wèn)題,相信也是飽受這個(gè)問(wèn)題的困擾。

面對(duì)這個(gè)難題,傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)選擇了放棄分布式的方案,因?yàn)樵?0世紀(jì)70~80年代,我們的數(shù)據(jù)庫(kù)主要被用來(lái)處理企業(yè)內(nèi)的各類(lèi)數(shù)據(jù),面對(duì)的用戶(hù)不過(guò)幾千人,而數(shù)據(jù)量最多也就是TB級(jí)別。用單臺(tái)機(jī)器來(lái)處理事務(wù),用個(gè)磁盤(pán)陣列處理一下磁盤(pán)容量不夠的問(wèn)題,基本上就能解決一切問(wèn)題了。

然而,信息化和互聯(lián)網(wǎng)的浪潮改變了這一切,我們突然發(fā)現(xiàn),我們服務(wù)的對(duì)象發(fā)生了根本性變化,從原來(lái)的幾千人,變成了現(xiàn)在的幾億人,數(shù)據(jù)量也從TB級(jí)別到了PB級(jí)別甚至更多。存在單點(diǎn)的單機(jī)系統(tǒng)無(wú)論如何努力,都會(huì)面對(duì)系統(tǒng)處理能力的天花板。原來(lái)的這條路,看起來(lái)是走不下去了,我們必須想辦法換一條路來(lái)走。

可是,分布式數(shù)據(jù)庫(kù)所面對(duì)的強(qiáng)一致性難題卻像一座高山,人們努力了無(wú)數(shù)個(gè)日日夜夜,但能翻越這座山的日子看來(lái)仍然遙遙無(wú)期。

于是,有一群人認(rèn)為,強(qiáng)一致性這件事看來(lái)不怎么靠譜,那徹底繞開(kāi)這個(gè)問(wèn)題是不是個(gè)更好的選擇?他們發(fā)現(xiàn)確實(shí)有那么一些場(chǎng)景是不需要強(qiáng)一致事務(wù)的,甚至連SQL都可以不要,最典型的就是日志流水的記錄與分析這類(lèi)場(chǎng)景。而去掉了事務(wù)和SQL,接口簡(jiǎn)單了,性能就更容易得到提升,擴(kuò)展性也更容易實(shí)現(xiàn),這就是NoSQL系統(tǒng)的起源。

雖然NoSQL解決了性能和擴(kuò)展性問(wèn)題,但這種繞開(kāi)問(wèn)題的方法給用戶(hù)帶來(lái)了很多困擾,系統(tǒng)的開(kāi)發(fā)成本也大大提升。這時(shí)候就有另外一群人,他們覺(jué)得用戶(hù)需要SQL,覺(jué)得用戶(hù)也需要事務(wù),問(wèn)題的關(guān)鍵在于我們要努力地往圣杯的方向不斷前進(jìn)。在保持系統(tǒng)的擴(kuò)展性和性能的前提下,付出盡可能小的代價(jià)來(lái)滿(mǎn)足業(yè)務(wù)對(duì)數(shù)據(jù)庫(kù)的需要。這就是NewSQL這個(gè)理念的由來(lái)。

DRDS也是一個(gè)NewSQL的系統(tǒng),它與ScaleBase、VoltDB等系統(tǒng)類(lèi)似,都希望能夠找到一條既能保持系統(tǒng)的高擴(kuò)展性和高性能,又能盡可能保持傳統(tǒng)數(shù)據(jù)庫(kù)的ACID事務(wù)和SQL特性的分布式數(shù)據(jù)庫(kù)系統(tǒng)。

DRDS發(fā)展歷程

在一開(kāi)始,TDDL的主要功能就是做數(shù)據(jù)庫(kù)切分,一個(gè)或一組SQL請(qǐng)求提交到TDDL,TDDL進(jìn)行規(guī)則運(yùn)算后得知SQL應(yīng)該被分發(fā)到哪個(gè)機(jī)器,直接將SQL轉(zhuǎn)發(fā)到對(duì)應(yīng)機(jī)器即可(如圖1)。

圖1 TDDL數(shù)據(jù)庫(kù)切分

開(kāi)始的時(shí)候,這種簡(jiǎn)單的路由策略能夠滿(mǎn)足用戶(hù)的需要,我們開(kāi)始的那些應(yīng)用,就是通過(guò)這樣非常簡(jiǎn)單的方式完成了他所有的應(yīng)用請(qǐng)求。我們也認(rèn)為,這種方案簡(jiǎn)單可靠,已經(jīng)足夠好用了。

然而,當(dāng)我們服務(wù)的應(yīng)用從十幾個(gè)增長(zhǎng)到幾百個(gè)的時(shí)候,大量的中小應(yīng)用加入,大家紛紛表示,原來(lái)的方案限制太大,很多應(yīng)用其實(shí)只是希望做個(gè)讀寫(xiě)分離,希望能有更好的SQL兼容性。

于是,我們做了第一次重大升級(jí),在這次升級(jí)里,我們提出了一個(gè)重要的概念就是三層架構(gòu),Matrix對(duì)應(yīng)數(shù)據(jù)庫(kù)切分場(chǎng)景,對(duì)SQL有一定限制,Group對(duì)應(yīng)讀寫(xiě)分離和高可用場(chǎng)景,對(duì)SQL幾乎沒(méi)有限制。如圖2所示。

圖2 數(shù)據(jù)庫(kù)升級(jí)為三層架構(gòu)

這種做法立刻得到了大家的認(rèn)可,TDDL所提供的讀寫(xiě)分離、分庫(kù)分表等核心功能,也成為了阿里集團(tuán)內(nèi)數(shù)據(jù)庫(kù)領(lǐng)域的標(biāo)配組件,在阿里的幾乎所有應(yīng)用上都有應(yīng)用。最為難得的是,這些功能從上線(xiàn)后,到現(xiàn)在已經(jīng)經(jīng)歷了多年雙11的嚴(yán)酷考驗(yàn),從未出現(xiàn)過(guò)嚴(yán)重故障(p0、p1級(jí)別故障屬于嚴(yán)重故障)。數(shù)據(jù)庫(kù)體系作為整個(gè)應(yīng)用系統(tǒng)的重中之重,能做到這件事,真是非常不容易。

隨著核心功能的穩(wěn)定,自2010年開(kāi)始,我們集中全部精力開(kāi)始關(guān)注TDDL后端運(yùn)維系統(tǒng)的完善與改進(jìn)性工作。在DBA團(tuán)隊(duì)的給力配合下,圍繞著TDDL,我們成功做到了在線(xiàn)數(shù)據(jù)動(dòng)態(tài)擴(kuò)縮、異步索引等關(guān)鍵特征,同時(shí)也比較成功地構(gòu)建了一整套分布式數(shù)據(jù)庫(kù)服務(wù)管控體系,用戶(hù)基本上可以完全自助地完成整套數(shù)據(jù)庫(kù)環(huán)境的搭建與初始化工作。

大概是2012年,我們?cè)诎⒗镌茍F(tuán)隊(duì)的支持下,開(kāi)始嘗試將TDDL這套體系輸出到阿里云上,也有了個(gè)新的名字:阿里分布式數(shù)據(jù)庫(kù)服務(wù)(DRDS),希望能夠用我們的技術(shù)服務(wù)好更多的人。

不過(guò)當(dāng)我們滿(mǎn)懷自信地把自己的軟件拿到云上的時(shí)候,卻發(fā)現(xiàn)我們的軟件距離用戶(hù)的要求差距很大。在內(nèi)部因?yàn)橛蠨BA的同學(xué)們幫助進(jìn)行SQL review,所以SQL的復(fù)雜度都是可控的。然而到了云上,看了各種渠道提過(guò)來(lái)的兼容性需求,我們經(jīng)常是不自覺(jué)地發(fā)出這樣的感嘆:“???原來(lái)這種語(yǔ)法MySQL也是可以支持的?”

于是,我們又進(jìn)行了架構(gòu)升級(jí),這次是以兼容性為核心目標(biāo)的系統(tǒng)升級(jí)工作,希望能夠在分布式場(chǎng)景下支持各類(lèi)復(fù)雜的SQL,同時(shí)也將阿里這么多年來(lái)在分布式事務(wù)上的積累都帶到了DRDS里面。

這次架構(gòu)升級(jí),我們的投入史無(wú)前例,用了三年多才將整個(gè)系統(tǒng)落地完成。我們先在內(nèi)部以我們自己的業(yè)務(wù)作為首批用戶(hù)上線(xiàn),經(jīng)過(guò)了內(nèi)部幾百個(gè)應(yīng)用的嚴(yán)酷考驗(yàn)以后,我們才敢拿到云上,給到我們的最終用戶(hù)使用。

目前,我們正在將TDDL中更多的積累輸出到云上,同時(shí)也努力優(yōu)化我們的用戶(hù)界面。PS:其實(shí)用戶(hù)界面優(yōu)化對(duì)我們這種專(zhuān)注于高性能后端技術(shù)的團(tuán)隊(duì)來(lái)說(shuō),才是最大的技術(shù)挑戰(zhàn),連我也去學(xué)了AngularJS,參與了用戶(hù)UI編。

DRDS主要功能介紹

發(fā)展歷史看完了,下面就由我來(lái)介紹一下目前我們已經(jīng)輸出到云上的主要功能。

【分布式SQL執(zhí)行引擎】

分布式SQL引擎主要的目的,就是實(shí)現(xiàn)與單機(jī)數(shù)據(jù)庫(kù)SQL引擎的完全兼容。目前我們的SQL引擎能夠做到與MySQL的SQL引擎全兼容,包括各類(lèi)join和各類(lèi)復(fù)雜函數(shù)等。他主要包含SQL解析、優(yōu)化、執(zhí)行和合并四個(gè)流程,如圖3中綠色部分。

圖3 SQL引擎實(shí)現(xiàn)的主要流程

雖然SQL是兼容的,但是分布式SQL執(zhí)行算法與單機(jī)SQL的執(zhí)行算法卻完全不同,原因也很簡(jiǎn)單,網(wǎng)絡(luò)通信的延遲比單機(jī)內(nèi)通信的延遲大得多。舉個(gè)例子說(shuō)明一下,我們有份文件要從一張紙A上謄寫(xiě)到另外一張紙B上,單機(jī)系統(tǒng)就好比兩張紙都在同一個(gè)辦公室里,而分布式數(shù)據(jù)庫(kù)則就像是一張紙?jiān)诒本粡埣堅(jiān)诤贾荨?/p>

自然地,如果兩張紙?jiān)谕粋€(gè)辦公室,因?yàn)閭鬏斁嚯x近,逐行謄寫(xiě)的效率是可以接受的。而如果距離是北京到杭州,用逐行謄寫(xiě)的方式,就立刻顯得代價(jià)太高了,我們總不能看一行,就打個(gè)“飛的”去杭州寫(xiě)下來(lái)吧。在這種情況下,還是把紙A上的信息拍個(gè)照片,【一整批的】帶到杭州去處理,明顯更簡(jiǎn)單一些。這就是分布式數(shù)據(jù)庫(kù)特別強(qiáng)調(diào)吞吐調(diào)優(yōu)的原因,只要是涉及到跨機(jī)的所有查詢(xún),都必須盡可能的積攢一批后一起發(fā)送,以減少系統(tǒng)延遲提高帶來(lái)的不良影響。

【按需數(shù)據(jù)庫(kù)集群平滑擴(kuò)縮】

DRDS允許應(yīng)用按需將新的單機(jī)存儲(chǔ)加入或移出集群,DRDS則能夠保證應(yīng)用在遷移流程中實(shí)現(xiàn)不停機(jī)擴(kuò)容縮容。

圖4 DRDS按需進(jìn)行平滑擴(kuò)縮

在內(nèi)部的數(shù)據(jù)庫(kù)使用實(shí)踐中,這個(gè)功能的一個(gè)最重要應(yīng)用場(chǎng)景就是雙11了。在雙11之前,我們會(huì)將大批的機(jī)器加入到我們的數(shù)據(jù)庫(kù)集群中,抗過(guò)了雙11,這批機(jī)器就會(huì)下線(xiàn)。

當(dāng)DRDS來(lái)到云上,我們發(fā)現(xiàn)雙11其實(shí)不僅僅只影響阿里內(nèi)部的系統(tǒng)。在下游的各類(lèi)電商輔助性系統(tǒng)其實(shí)也面對(duì)巨大壓力。在雙11前5天,網(wǎng)聚寶的熊總就找到我說(shuō),擔(dān)心撐不過(guò)雙11的流量,怕系統(tǒng)掛。于是我們就給他介紹了這個(gè)自動(dòng)擴(kuò)容的功能怎么用,他買(mǎi)了一個(gè)月的數(shù)據(jù)庫(kù),掛接在DRDS上。數(shù)據(jù)庫(kù)能力立刻翻倍,輕松抗過(guò)了雙11,也算是我印象比較深刻的一個(gè)案例了。

因?yàn)槲覀兺耆珶o(wú)法預(yù)測(cè)在什么時(shí)間點(diǎn)系統(tǒng)會(huì)有爆發(fā)性的增長(zhǎng),而如果在這時(shí)候系統(tǒng)因?yàn)榧夹g(shù)原因不能使用,就會(huì)給整個(gè)業(yè)務(wù)帶來(lái)毀滅性的影響,風(fēng)口一旦錯(cuò)過(guò),就追悔莫及了。我想這就是云計(jì)算特別強(qiáng)調(diào)可擴(kuò)展能力的原因吧。

【小表廣播】

小表廣播也是我們?cè)诜植际綌?shù)據(jù)庫(kù)領(lǐng)域內(nèi)最常用的工具之一,他的核心目的其實(shí)都是一個(gè)——盡可能讓查詢(xún)只發(fā)生在單機(jī)。

讓我們用一個(gè)例子來(lái)說(shuō)明,小表廣播的一般使用場(chǎng)景。

圖5 小表廣播場(chǎng)景

圖5中,如果我想知道買(mǎi)家id等于0的用戶(hù)在商城里面買(mǎi)了哪些商品,我們一般會(huì)先將這兩個(gè)表join起來(lái),然后再用where平臺(tái)名=”商城” and buyerID = 0找到符合要求的數(shù)據(jù)。然而這種join的方式,會(huì)導(dǎo)致大量的針對(duì)左表的網(wǎng)絡(luò)I/O。如果要取出的數(shù)據(jù)量比較大,系統(tǒng)延遲會(huì)明顯上升。

這時(shí)候,為了提升性能,我們就必須要減少跨機(jī)join的網(wǎng)絡(luò)代價(jià)。我們比較推薦應(yīng)用做如下處理,將左表復(fù)制到右表的每一個(gè)庫(kù)上。這樣,join操作就由分布式j(luò)oin一下變回到本地join,系統(tǒng)的性能就有很大的提升了,如圖6所示。

圖6

【分布式事務(wù)套件】

在阿里巴巴的業(yè)務(wù)體系中存在非常多需要事務(wù)類(lèi)的場(chǎng)景,下單減庫(kù)存,賬務(wù),都是事務(wù)場(chǎng)景最集中的部分。

而我們處理事務(wù)的方法卻和傳統(tǒng)應(yīng)用處理事務(wù)的方案不大一樣,我們非常強(qiáng)調(diào)事務(wù)的最終一致性和異步化。利用這種方式,能夠極大地降低分布式系統(tǒng)中鎖持有的時(shí)間,從而極大地提升系統(tǒng)性能。

圖7 DRDS分布式事務(wù)解決套件

這種處理機(jī)制,是我們分布式事務(wù)能夠以極低成本大量運(yùn)行的最核心法門(mén)。在DRDS平臺(tái)內(nèi),我們將這些方案產(chǎn)品化,為了DRDS的分布式事務(wù)解決套件。

利用他們,能夠讓你以比較低的成本,實(shí)現(xiàn)低延遲,高吞吐的分布式事務(wù)場(chǎng)景。

DRDS的未來(lái)

阿里分布式數(shù)據(jù)庫(kù)服務(wù)DRDS上線(xiàn)至今,大家對(duì)這款產(chǎn)品的熱情超出了我們的預(yù)期,短短半年內(nèi)已經(jīng)有幾千個(gè)申請(qǐng)。

盡管還在公測(cè)期,但是大家就已經(jīng)把關(guān)系到身家性命的寶貴在線(xiàn)數(shù)據(jù)業(yè)務(wù)放到了DRDS上,我能夠感受到這份沉甸甸的信賴(lài),也不想辜負(fù)這份信賴(lài)。

經(jīng)過(guò)阿里內(nèi)部幾千個(gè)應(yīng)用的不斷歷練,DRDS已經(jīng)積累出一套強(qiáng)大的分布式SQL執(zhí)行引擎和和一整套分布式事務(wù)套件。

我也相信,這些積累能夠讓用戶(hù)在基本保持單機(jī)數(shù)據(jù)庫(kù)的使用習(xí)慣的前提下,享受到分布式數(shù)據(jù)庫(kù)高性能可擴(kuò)展的好處。

在平時(shí)的DRDS支持過(guò)程中,我面對(duì)最多的問(wèn)題就是,DRDS能不能夠在不改變?nèi)魏卧袠I(yè)務(wù)邏輯和代碼的前提下,實(shí)現(xiàn)可自由伸縮和擴(kuò)展呢?十分可惜的是,關(guān)系數(shù)據(jù)庫(kù)發(fā)展至今,還沒(méi)有找到既能保留傳統(tǒng)數(shù)據(jù)庫(kù)一切特性,又能實(shí)現(xiàn)高性能可擴(kuò)展數(shù)據(jù)庫(kù)的方法。

然而,雖不能至,吾心向往之!我們會(huì)以“可擴(kuò)展,高性能”為產(chǎn)品核心,堅(jiān)定地走在追尋圣杯的路上,并堅(jiān)信最終我們一定能夠找尋到它神圣的所在。

作者簡(jiǎn)介:王晶昱,花名沈詢(xún),阿里巴巴資深技術(shù)專(zhuān)家。目前主要負(fù)責(zé)阿里的分布式數(shù)據(jù)庫(kù)DRDS(TDDL)和阿里的分布式消息服務(wù)ONS(RocketMQ/Notify)兩個(gè)系統(tǒng)。

網(wǎng)站名稱(chēng):阿里開(kāi)發(fā)的nosql,阿里開(kāi)發(fā)的搜索引擎
網(wǎng)站網(wǎng)址:http://chinadenli.net/article22/dsdgsjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、搜索引擎優(yōu)化、標(biāo)簽優(yōu)化域名注冊(cè)、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)