后台系统可扩展性学习笔记(十四)异步机制与MQ
對(duì)于 Web 服務(wù)而言,提升可擴(kuò)展性的主要途徑是將耗時(shí)的同步工作改成異步處理,從而允許將這些工作“外包”給多個(gè) Worker 去做,或者提前完成能夠預(yù)知的部分。
異步機(jī)制與可擴(kuò)展性之間的關(guān)系需要從(異步)并行處理的優(yōu)勢說起。
串行、并發(fā)與并行
可擴(kuò)展性,意味著能通過向系統(tǒng)添加資源的方式應(yīng)對(duì)不斷增加的工作量。
對(duì)于多個(gè)任務(wù),一般有 3 種執(zhí)行策略:
- 串行:一個(gè)接一個(gè)地同步執(zhí)行,總耗時(shí)為所有任務(wù)之和
- 并發(fā):多 CPU/多核并發(fā)執(zhí)行,總耗時(shí)取決于最慢的任務(wù)耗時(shí)
- 并行:異步并行執(zhí)行,總耗時(shí)同樣取決于最慢的任務(wù)耗時(shí)
異步的意義
除了可擴(kuò)展性方面的優(yōu)勢外,異步更多的意義在于:
- 可打斷/可暫停:允許分片執(zhí)行,而不必一次做完
- 可調(diào)度:允許更細(xì)粒度的時(shí)間管理,比如閑時(shí)主動(dòng)執(zhí)行、甚至離線執(zhí)行
- 并行的可能性:異步返回結(jié)果,意味著任務(wù)可以交給其他worker執(zhí)行
- 解耦生產(chǎn)者和消費(fèi)者:把worker分離出去,使之能夠獨(dú)立擴(kuò)展,比如只加worker而不加web server
消息隊(duì)列
實(shí)現(xiàn)上,最常見的異步機(jī)制當(dāng)然是消息隊(duì)列:由消息隊(duì)列提供異步通信協(xié)議,消息的發(fā)送方和接收方不需要同時(shí)與消息隊(duì)列進(jìn)行交互。
例如,郵件系統(tǒng)中,發(fā)件人將郵件發(fā)出之后,可以繼續(xù)處理其他內(nèi)容,而無需等待收件人響應(yīng)。在用戶看來,任務(wù)是立即完成的,但實(shí)際上是在一段時(shí)間之后才真正完成(所謂異步)。
消息隊(duì)列的運(yùn)作中有 3 個(gè)角色,消息的生產(chǎn)者、消費(fèi)者以及經(jīng)紀(jì)人(Broker):
- 生產(chǎn)者:應(yīng)用程序往隊(duì)列里發(fā)布任務(wù)后,立即告知用戶該任務(wù)的狀態(tài)
- 消費(fèi)者:worker拿到任務(wù)并執(zhí)行,完成之后通知
- Broker:從隊(duì)列里取出任務(wù)并分發(fā)給worker,并負(fù)責(zé)管理任務(wù)的完整性,包括失敗重試、(根據(jù)worker的實(shí)際狀態(tài))動(dòng)態(tài)調(diào)整分發(fā)策略
消息隊(duì)列還得考慮下面的一些問題:
- 消息可能會(huì)丟失,比如消費(fèi)者掛了、消息隊(duì)列掛了
- 消息可能會(huì)重發(fā)多次,比如消費(fèi)者消費(fèi)完忘記發(fā)送ack了
- 可能會(huì)出現(xiàn)忙閑不均的情況,比如輪流分發(fā)的話,有些worker接到的總是重活兒
- 隊(duì)列可能溢出,比如worker太少或太忙,導(dǎo)致消息迅速堆積
更多的關(guān)于MQ的設(shè)計(jì)的方面的可以參考一下以前的筆記:
消息隊(duì)列重要機(jī)制講解以及MQ設(shè)計(jì)思路
漏斗模型
消息隊(duì)列就像一個(gè)漏斗,用來控制流量和流速:
洶涌而至的消息從敞口流入,經(jīng)過縮口以固定的流速輸出給(消息的)消費(fèi)者:
如果生產(chǎn)速率始終低于消費(fèi)速率,倒進(jìn)來立即就流走了,那么就不需要漏斗(消息隊(duì)列)。
如果生產(chǎn)速率始終大于消費(fèi)速率,就會(huì)在漏斗中累積,最終填滿、溢出,導(dǎo)致消息丟失:
這種現(xiàn)象稱為Back pressure(反向壓力),下游消費(fèi)速度限制了傳輸,此時(shí)可以限制隊(duì)列大小,排滿了就返回 503,稍后重試(比如采取指數(shù)退避策略,讓重試間隔越來越長)。所以,只有生產(chǎn)速率在短期內(nèi)大于(而不是始終大于)消費(fèi)速率的情況下,漏斗才有意義——用來吸收暫時(shí)的超量生產(chǎn)量。
利特爾法則
隊(duì)列中的消息實(shí)際上等同于在排隊(duì)。
排隊(duì)理論中一個(gè)有名的定理叫利特爾法則:
適用于任何穩(wěn)定運(yùn)轉(zhuǎn)的排隊(duì)系統(tǒng):
“排隊(duì)系統(tǒng)”由離散對(duì)象組成,我們稱之為“物品”,它們以某種速率“到達(dá)”到“系統(tǒng)”在系統(tǒng)中,這些項(xiàng)目可能會(huì)形成一個(gè)或多個(gè)隊(duì)列,最終接收“服務(wù)”并退出。
“穩(wěn)定運(yùn)轉(zhuǎn)”,是指不包括系統(tǒng)啟動(dòng)、退出等過渡狀態(tài).
"物品”經(jīng)過的狀態(tài):到達(dá) -> 排隊(duì) -> 離開。
L = λW就是說:
隊(duì)伍的平均長度 = 平均到達(dá)速度 * (每一項(xiàng)的)平均等待時(shí)間
例如:
酒窖:偶爾買一瓶放進(jìn)去,平均每個(gè)月買 8 瓶,朋友聚會(huì)時(shí)候喝掉一些,但多數(shù)時(shí)候窖里都有 160 瓶,那么,就可以知道取出來喝的時(shí)候,每瓶酒在酒窖里平均存放了 1.67 年(W = 160 / (8 * 12)),離陳釀還有一段距離
郵箱:平均每天收到 50 封新郵件,郵箱里多數(shù)時(shí)候有 150 封未讀郵件,那么平均每 3 天(W = 150 / 50)處理一封郵件,可以作為郵件處理效率的衡量標(biāo)準(zhǔn)
工廠:每天平均加工 1000 份原材料,在制品(WIP, work-in-process)數(shù)量平均有 45000 個(gè),那么每件產(chǎn)品的加工周期是 45 天(W = 45000 / 1000),周期比較長
醫(yī)院:某地區(qū)平均每天誕生 5 名新生兒,待產(chǎn)媽媽平均會(huì)在產(chǎn)房待 2.5 天,那么,產(chǎn)房通常住有 12.5 位(L = 5 * 2.5)待產(chǎn)媽媽,也就是說,產(chǎn)房床位不能少于 13 張,對(duì)應(yīng)的醫(yī)護(hù)人員也不能太少
三項(xiàng)中,只要知道兩個(gè)(易知的)就能粗略得出另一個(gè)(難算的),這就是利特爾法則的意義。
參考
http://www.ayqy.net/blog/asynchronism/
總結(jié)
以上是生活随笔為你收集整理的后台系统可扩展性学习笔记(十四)异步机制与MQ的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 颐和园走完需要多长时间
- 下一篇: 后台系统可扩展性学习笔记