干货 | 金融级消息队列的演进 — 蚂蚁金服的实践之路
小螞蟻說:
消息隊列作為一個數據的集散中心,承載了越來越多的場景和數據,從最開始的 OLTP 到 OLAP,甚至再到物聯網、人工智能、機器學習等場景,都有很大的想像空間。 在能力上,消息隊列現在擁有了數據,擁有了算力,從承載數據走到理解數據。
螞蟻金服也在思考給消息隊列加入算法的能力,讓算法走進消息隊列,走向下一個階段 :洞察數據。把這些能力綜合起來,打造一個智慧的傳輸計算服務平臺。
還有一個好消息,消息隊列作為 SOFA (Scalable Open Financial Architecture )技術體系比較核心的組成部分,后續也會積極擁抱開源和社區。
本文根據蔣濤在 GIAC 2018 的主題分享《金融級消息隊列的演進之路》整理編輯,將給大家分享螞蟻金服消息隊列發展過程中的故事,以及這個過程中的架構思考。
金融場景下的消息系統的關鍵需求
在螞蟻金服,消息隊列已經有十多年的歷史了。在07、08年時,我們采用了 ESB 這樣的方式來實現消息的機制。
那個時候遇到的最頭疼的問題就是丟消息,排查和修復起來非常的痛苦。到了09年,和淘寶共建并上線了新的消息隊列系統,丟消息的問題得到了有效的改善。
螞蟻的業務具有金融級的屬性,從這個角度,有哪些比較關鍵的需求呢? 集中表現為以下四點:
對比經典的消息系統,需要建立哪些機制來滿足以上的關鍵需求?
剛剛提到了金融場景下的四個核心的性能要求,那么具體如何來滿足呢?
1. 如何做到極高的可靠性?
- ACK 的機制。ACK 機制借鑒了 TCP 里面的思路,通過發送階段、持久化階段、投遞階段的 ACK 機制,保證了消息在流轉路徑的各個環節上的可靠性。
- 重試的機制,保證了消息在投遞出去后,當消費端消費不成功的時候,還可以再次去消費。
- 通過存儲層的持久化機制和可靠性機制來保證消息數據本身的可靠性。
2. 采用兩階段事務消息機制來保證極強的一致性
在第一階段里面,把發消息和業務自己的業務操作放到本地事務中,發出來的是帶有未提交狀態的消息。 在第二階段,會根據本地事務執行的情況來決定一階段發出來的消息是提交還是回滾,如果是回滾,把消息刪掉就好了,如果是提交,會去更新這個消息的狀態,從未提交改成已提交,接著去做投遞的動作。
如果第二階段中的事務狀態通知丟失了,消息服務端會去主動向消息發送端做事務狀態回查,直到拿到明確的事務提交或者回滾的回查結果。
3. 持續的可用性的實現
在單機房的時代就在做提升可用性的事情。比如,在應用層面做了線程池的隔離,做了限流、熔斷等等。在架構層面去做各種水平伸縮能力,在故障隔離層面做單點的隔離,做集群部署的隔離等等。這些手段提高了系統的可用性。
但是,由于受限于單機房部署的架構,當出現機房級別問題的時候,前面的手段就心有余而力不足了。
當然,同城雙活架構可以通過業務流量在兩個機房之間做切換,也可以通過數據層面的切換等手段來有效的解決機房單點的問題。
但是,隨著業務增長,同城雙機房模式在容量和容災能力上也逐漸無法滿足業務發展需求了。
面對同城雙活也無法解決的情況,螞蟻金服沉淀出異地多活 LDC 架構:
在 LDC 架構下,對消息隊列有怎樣的需求?
以轉賬為例,在異地多活的架構下,收款方跟轉賬人可能在一個邏輯 Zone 里面,也可能不在一個邏輯 Zone 里面,甚至他們可能都不在一個城市。這樣帶來一個最重要、最核心的需求就是消息隊列需要具有非常靈活、非常強大的路由能力,可以做Zone內的路由,可以做同城跨Zone的路由,也可以做跨城跨 Zone 的路由。
在實現上,如果發現這個消息是要做同城跨 Zone 的路由,在消息服務端做了一個打通,通過服務端做轉發,當發現是跨城場景的時候,通過一個叫 MQ-router 的系統,對跨城的鏈路做了一個收斂,也對城市級部署的邏輯做了一個收口,所有需要經過跨城的邏輯全部收口到這樣一個系統當中,統一并靈活的支撐了異地多活的架構。
在 LDC 架構下面,消息有趣的應用場景
有一類會員信息數據,比較有特點:
于是,我們設計了一個基于消息的方案,來實現一個城市級的緩存更新的機制。重點給 MQ-router 增加了廣播的能力。當這類數據發生變更的時候,以消息的方式發出來,通過 MQ-router 以廣播的形式發送到所有城市去,這樣就達到了多個城市的緩存實時更新的效果。
4. 性能方面是持續在打磨的一件事情
消息隊列基于 SEDA 模式來實現,引入了自研的高性能網絡通信層 SOFABolt來提高消息通信的性能。除此傳統的優化手段之外,也在調研和思考更先進的一些方式,比如硬件結合的方式,像DPDK、RDMA這樣的技術,去追求更極致的性能。
擁抱大數據時代,我們做了拉模式的消息隊列
有很長一段時間,消息隊列的研發工作都是圍繞著交易、支付、賬務等OLTP的業務展開。所以一直在打磨消息隊列在OLTP場景下的功能。比如,通過數據庫存儲保證消息可靠性,通過推的模式提高消息的實時性等。 隨著業務場景的擴展,特別是大數據時代的到來,越來越多的OLAP場景出現了。這個時候前面的這些做法,特別是推的這種模式就遇到很多的困難。
到了這個階段,我們去做了基于Log語義的拉模式的消息隊列。 拉模式消息部署在物理機上,通過順序寫本地磁盤的方式去實現拉的語義。在一定時間內比較有效的支持了OLAP這種場景的需求。
走向計算存儲分離的架構,從掛盤模式到 API 模式
隨著拉模式的推廣,很多 OLTP 的場景也逐漸的采用了拉模式,提出了很多新的需求。比如 OLTP 對數據可靠性要求比較高,對本地文件存儲可靠性的問題就非常關注。
由于是基于物理機部署,也遇到很多運維上的難點,比如成本、機型等等的一些問題。特別是物理機機型變化非常多,每次采購可能都不一樣,非常難以做標準化。在做容量規劃、縮容擴容這些事情時會遇到非常多的困難。
消息是比較重 IO 輕計算的模型,在物理機上就會表現出非常明顯的資源配比不均衡的問題。往往是磁盤已經不夠用了,但 CPU 還很空閑。基于物理機的運維也很復雜,資源利用率不高、容量規劃不好做、擴容縮容困難等問題凸顯。
在做這件事情的時候,我們一開始采取了一種比較輕量的方式,稱之為掛盤的模式。 通過掛載的方式,將分布式文件系統掛在消息隊列應用上面。這個做法的好處是應用系統本身基本上不需要做什么改造。消息數據透明的寫到了分布式文件系統上,依靠分布式文件系統提供的三副本高可靠的能力來保障消息數據的可靠性。
在這個階段還做了一件事情,就是把消息應用的規格做了標準化。可以去制定類似8C、16G、1T 這樣的規格,有了標準規格,就可以比較準確的測算某個規格可以頂多少TPS的消息量,這樣做容量規劃就很容易了。 這個模式上去之后,承載了一些業務,也接受了雙十一大促的考驗。
于是,我們開始了計算存儲分離的第二階段:API 模式,在性能上有了一個比較明顯的提升。 這個模式下,消息服務端要做比較大的改動,趁著這個機會,也做了很多功能方面的增強。比如,加入了對全局固定分區的支持,還有發送冪等與強順序的能力等。 同時,把數據落地也做了一個改變,原先數據全部集中在一個commit log中,轉移到了隊列里面去。這樣帶來的好處是可以在隊列級別做更細粒度的配置和管控。
這個架構整體而言是一個相對比較完善的計算存儲分離的架構了。在應用層面也做了很多可擴展的設計。
整體上,計算存儲分離的模式給消息隊列打下比較好的基礎,可以跟螞蟻金服全站的運維模式做很好的適配。
讓計算走進消息隊列,賦予消息隊列計算能力
消息隊列承載了越來越多的消息數據,大量的數據流進來再流出去。都說在大數據時代,數據就是金錢,但是可以發現這么多的數據流過消息隊列,卻沒有淘到金。
通過思考這個問題,發現非常關鍵的一點是因為一直在用一種比較傳統的方式去看待消息隊列,認為它是消息的一個通道,消息流進來再流出去,使命就結束了。在這樣的思路下,著力打造的是它的傳輸能力,它的存儲能力,它的可靠性等。但是卻忽略了在大數據時代非常重要的一個能力,就是計算的能力。
帶著這個問題去看業界的一些發展,得到了很多新的思路。特別是從Kafka身上得到了很多的啟發。
于是我們決定讓計算走進消息隊列,以 streaming 方式為消息隊列增加了一種計算能力,實現了一個輕量級的非中心式的計算框架,既可以嵌入客戶端,也可以嵌入消息的服務端,做一些輕量級的計算,支持一些比較通用和輕量的算子和多種計算窗口語義。
至此,消息隊列有了傳輸、存儲和計算的能力
基于這些能力,把消息隊列往更大的層面上去推進,構建一個數據傳輸計算平臺。不斷豐富消息隊列能力,不斷拓展越來越豐富的數據源,獲取越來越多樣的數據,并且把消息投遞到更多的目的地去。在傳輸過程中對消息進行計算,以獲得更多計算帶來的價值。
總結
通過前面的回顧,我們可以看到,消息隊列作為一個數據的集散中心,承載了越來越多的場景和數據。
在能力上,消息隊列現在擁有了數據,擁有了算力,正在走過一條從承載數據到理解數據的道路。接下來,我們也在思考給消息隊列加入算法的能力,讓算法走進消息隊列。 這樣就可以向下一個階段 -- 洞察數據再邁出一步,就可以把這些能力綜合起來,去打造一個智慧的傳輸計算服務平臺。這樣消息數據不僅是流轉過消息隊列,還可以經過更多的計算和加工,更輕快更實時的發揮更大的價值。
交流社群
我們也為對 SOFA 中間件感興趣的同學準備了微信的交流群,歡迎感興趣的同學添加加群小助手(微信號:Ant-Techfin01)加入我們 SOFA 交流群討論和咨詢相關問題哦。
歡迎訪問 http://github.com/alipay 了解更多 SOFA 開源信息(也可閱讀原文查看),共同打造SOFAStack 。更多最新分布式架構干貨,請關注公眾號《金融級分布式架構
總結
以上是生活随笔為你收集整理的干货 | 金融级消息队列的演进 — 蚂蚁金服的实践之路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring boot实现软删除
- 下一篇: 26期20180703 正则 grep