小紅希望小明多讀書浓若,常尋找好書給小明看,之前的方式是這樣:小紅問小明什么時候有空蛇数,把書給小明送去挪钓,并親眼監(jiān)督小明讀完書才走。久而久之耳舅,兩人都覺得麻煩碌上。
后來的方式改成了:小紅對小明說「我放到書架上的書你都要看」,然后小紅每次發(fā)現(xiàn)不錯的書都放到書架上浦徊,小明則看到書架上有書就拿下來看馏予。
書架就是一個消息隊列,小紅是生產(chǎn)者盔性,小明是消費者霞丧。
這帶來的好處有:
1.小紅想給小明書的時候,不必問小明什么時候有空冕香,親手把書交給他了蛹尝,小紅只把書放到書架上就行了。這樣小紅小明的時間都更自由悉尾。
2.小紅相信小明的讀書自覺和讀書能力突那,不必親眼觀察小明的讀書過程,小紅只要做一個放書的動作焕襟,很節(jié)省時間陨收。
3.當明天有另一個愛讀書的小伙伴小強加入,小紅仍舊只需要把書放到書架上鸵赖,小明和小強從書架上取書即可(唔务漩,姑且設(shè)定成多個人取一本書可以每人取走一本吧,可能是拷貝電子書或復(fù)印它褪,暫不考慮版權(quán)問題)饵骨。
4.書架上的書放在那里,小明閱讀速度快就早點看完茫打,閱讀速度慢就晚點看完居触,沒關(guān)系,比起小紅把書遞給小明并監(jiān)督小明讀完的方式老赤,小明的壓力會小一些轮洋。
這就是消息隊列的四大好處:
1.解耦
每個成員不必受其他成員影響,可以更獨立自主抬旺,只通過一個簡單的容器來聯(lián)系弊予。
小紅甚至可以不知道從書架上取書的是誰,小明也可以不知道往書架上放書的人是誰开财,在他們眼里汉柒,都只有書架误褪,沒有對方。
毫無疑問碾褂,與一個簡單的容器打交道兽间,比與復(fù)雜的人打交道容易一萬倍,小紅小明可以自由自在地追求各自的人生正塌。
2.提速
小紅選擇相信「把書放到書架上嘀略,別的我不問」,為自己節(jié)省了大量時間乓诽。
小紅很忙屎鳍,只能抽出五分鐘時間,但這時間足夠把書放到書架上了问裕。
3.廣播
小紅只需要勞動一次逮壁,就可以讓多個小伙伴有書可讀,這大大地節(jié)省了她的時間粮宛,也讓新的小伙伴的加入成本很低窥淆。
4.削峰
假設(shè)小明讀書很慢,如果采用小紅每給一本書都監(jiān)督小明讀完的方式巍杈,小明有壓力忧饭,小紅也不耐煩。
反正小紅給書的頻率也不穩(wěn)定筷畦,如果今明兩天連給了五本词裤,之后隔三個月才又給一本,那小明只要在三個月內(nèi)從書架上陸續(xù)取走五本書讀完就行了鳖宾,壓力就不那么大了吼砂。
當然,使用消息隊列也有其成本:
1.引入復(fù)雜度
毫無疑問鼎文,「書架」這東西是多出來的渔肩,需要地方放它,還需要防盜拇惋。2.暫時的不一致性假如媽媽問小紅「小明最近讀了什么書」周偎,在以前的方式里,小紅因為親眼監(jiān)督小明讀完書了撑帖,可以底氣十足地告訴媽媽蓉坎,但新的方式里,小紅回答媽媽之后會心想「小明應(yīng)該會很快看完吧……」
這中間存在著一段「媽媽認為小明看了某書胡嘿,而小明其實還沒看」的時期蛉艾,當然,小明最終的閱讀狀態(tài)與媽媽的認知會是一致的,這就是所謂的「最終一致性」伺通。
那么,該使用消息隊列的情況需要滿足什么條件呢逢享?
1.生產(chǎn)者不需要從消費者處獲得反饋
引入消息隊列之前的直接調(diào)用罐监,其接口的返回值應(yīng)該為空,這才讓明明下層的動作還沒做瞒爬,上層卻當成動作做完了繼續(xù)往后走——即所謂異步——成為了可能弓柱。
小紅放完書之后小明到底看了沒有,小紅根本不問侧但,她默認他是看了矢空,否則就只能用原來的方法監(jiān)督到看完了。
2.容許短暫的不一致性
媽媽可能會發(fā)現(xiàn)「有時候據(jù)說小明看了某書禀横,但事實上他還沒看」屁药,只要媽媽滿意于「反正他最后看了就行」,異步處理就沒問題柏锄。
如果媽媽對這情況不能容忍酿箭,對小紅大發(fā)雷霆,小紅也就不敢用書架方式了趾娃。
3.確實是用了有效果即解耦缭嫡、提速、廣播抬闷、削峰這些方面的收益妇蛀,超過放置書架、監(jiān)控書架這些成本笤成。
否則如果是盲目照搬评架,「聽說老趙家買了書架,咱們家也買一個」炕泳,買回來卻沒什么用古程,只是讓步驟變多了,還不如直接把書遞給對方呢喊崖,那就不對了挣磨。