Java 帝國之消息隊列
張家村的歷史
Java 帝國的張家村正在迎來一次重大的變革。
5年前網上購物興起的時候, 帝國非常看好, 決定向這個領域進軍, 于是興建了張家村, 在這里安裝了Java 虛擬機和數據庫, 然后部署了一個基于Web的訂單系統和一個庫存系統, 由張家村的人負責操作。
張家村的老村長很清楚, 說是兩個系統, 其實是邏輯上的一種劃分方式, 在物理上兩個系統還是部署在一個虛擬機中。 那個時候用戶量少, 數據量也不大, 村民們只要使用這一個Java 虛擬機和數據庫就足夠了。
訂單和庫存系統運轉一直很好, 用戶的訂單來了, 會在訂單系統中存下來, 然后通知庫存系統發貨。
你要問怎么通知? 老村長會告訴你說: 其實簡單的很, 就是普通Java 方法的直接調用, 調用庫存系統某個類的某個方法而已。 由于在同一個虛擬機之內, 效率極高 。
轉眼間5年過去了, 人類變得越來越懶, 越來越喜歡網上購物, 用戶量和數據量暴增, 再加上他們時不時搞個什么秒殺活動, 更是讓張家村變得不堪重負。 為了應付洶涌而來的訂單, 張家村經常徹夜燈火通明, 全村人三班倒才能勉強應付。
老村長向鎮上報告了很多次都沒有回音, 要不是帝國的性能監控部門發現了這個異常,還不知道要被瞞到什么時候。
還好,欽差王大人來了, 變革要開始了。
拆分
王大人經驗豐富, 目光如炬, 一眼就看出了問題, 立刻下達了***道命令: 拆分 ! 把訂單系統和庫存系統分開!
老村長說: “那拆開了以后,我們村還是放不下啊”
王大人道: “訂單系統還是留在張家村, 庫存系統挪到李家莊去”
老村長暗自思忖,訂單系統是直接面向用戶的,很重要, 張家村一定要保住, 至于庫存系統,主要是后臺操作,挪走就挪走吧, 于是就答應了。
拆分不是那么容易的, 訂單和庫存耦合的比較緊密, 現在要把庫存系統搬到李家莊的Java虛擬機和數據庫去,免不了一番劇烈的折騰。
在王大人的指導下, 原先那些直接的Java 方法調用,也被改成了Web 服務 -- 張家村和李家莊雖然距離較遠 , 還是有網絡相通的。
現在用戶下了訂單以后, 先在張家村保存, 然后由張家村調用李家莊的Web服務來通知庫存系統。
數據庫自然也做了拆分, 老的庫存數據被導出來, 再導入到李家莊的新數據庫中 。
不管過程是多么艱難, 兩個系統還是分了家,李家莊喜氣洋洋、敲鑼打鼓的迎接了庫存系統的部署, 開始了試運營。
新問題
由于只需要處理訂單, 張家村的負載一下子降了下來, 恢復了正常的作息。
可是好景不長,張家村很快發現李家莊對新系統根本不上心, 派了一個酒鬼小李去負責操作庫存Web服務, 小李喝醉了啥都忘了, Web服務經常用不了。
這還不算,李家莊是嚴格的日出而作, 日落而息, 張家村正在繁忙的處理訂單的時候, 李家莊已經把系統關了,睡覺去了。
這可苦了張家村的小張,用戶提交了訂單, 去調用Web服務通知庫存發貨, 可是Web服務經常不響應, 小張沒有辦法, 只好反復重試、等待一段時間后再試,導致一個訂單很長時間才能完成, 用戶體驗極差, 大家怨聲載道。
小張向李家莊投訴了很多次都不管用,沒人搭理,跨村莊協作可真是難啊!
小張活干的不好,工分減少, 再這么下去,月底分糧的時候又要餓肚子了,小張想起來了自己經歷過的《Java帝國之撥云見日識回調 》, 心里再次哀嘆: 為什么受傷的總是我?
晚上到家,小張苦思憫想: 原來訂單系統和庫存系統都在一個虛擬機中, 處理起來很方便, 但是現在是個遠程的Web服務, 酒鬼小李不給我返回結果, 我就沒法結束, 這是典型的同步操作, 能不能改成異步的呢?
我把一個訂單包裹發給小李, 他什么時候處理我就不用管了, 這樣我這邊的效率就會大大的提高! 可是現在的Web服務并不支持這種方式, 我怎么才能把包裹發過去呢?
消息隊列
小張徹夜未眠, 第二天一大早就去請教老村長。
村長說: “你能想到這一層,非常不錯! 近來我也一直在考慮這個問題啊, 在大型的分布式系統中,怎么做異步通信是個大問題, 我想到了一個叫消息隊列的東西”
“消息隊列? 沒有聽說過”
“就拿你遇到的情況來說吧, 我們開發一個消息隊列,名稱我都想好了,就叫ZhangMQ(Zhang Message Queue), 把它部署在我們張家村和李家莊之間, 我們村產生的訂單, 你只要負責把訂單消息寫到這個隊列里就完事大吉了。 ”
“奧,李家莊的酒鬼小李醒了,就讓他從這個消息隊列中讀取消息,進行處理,對吧”
“沒錯,這不就變成異步的了? 酒鬼小李不處理, 那就是他們的責任了”
"那訂單消息的格式需要和李家莊商量好, 另外次序也不能亂掉, 還有, 要是斷電了或者重啟了,消息隊列中的訂單消息也不能丟失 " 小張想的很深入
“沒錯,這些都是我們的ZhangMQ要考慮的,要實現持久化, 把訂單消息存到硬盤上”
“這真是不錯“ 小張躍躍欲試 ”村長,我想去開發這個ZhangMQ, 一定要讓我參加啊“
”沒問題, 不過我當前最重要的是說服李家莊, 讓他們來采用我們的消息隊列“
經過據理力爭和艱難協商,李家莊終于同意了消息隊列的方案,畢竟對他們也沒啥損失, 也不用聽張家村沒完沒了的投訴了,只需要改一點點代碼,從消息隊列中讀取訂單即可。
小張和其他人在家里埋頭開發ZhangMQ, 半年后,ZhangMQ正式上線, 徹底解決了異步通信的問題。
前欽差王大人對張家村做了回訪,發現了消息隊列,贊不絕口,回去后就發來了褒獎令,還下令在帝國推廣, ZhangMQ一下子出名了!
【本文為51CTO專欄作者“劉欣”的原創稿件,轉載請通過作者微信公眾號coderising獲取授權】