隨着美團配送業務的飛速發展,單量已經達到千萬級別,同時天天產生的資金額已經超過幾千萬,清結算系統在保證線上服務穩定可靠的前提下,如何系統化的保障資金安全是很是核心且重要的課題,配送清結算系統通過近3年的建設和打磨,在資金安全保障的多個方面均有一些總結和實踐,保障資金安全是值得系統思考的課題,隻言片語難以全面歸納,須要更多的着墨才能較完整闡述。html
本文側重點會闡述「對帳」的概念,在支付&清結算領域,這是一個很是重要的專業名詞,下文將介紹「對帳」在分佈式系統建設中的實踐和解決方案,力求在系統覆蓋度、資金準確性、時效等多個維度爲系統資金安全保駕護航,實現更健壯可靠的資金履約。數據庫
隨着美團外賣配送事業的蓬勃發展,配送清結算業務的複雜性也在不斷的增高,總結起來,主要有如下幾個特色:安全
在這樣的業務背景下,咱們的系統可謂險象環生。因業務高度複雜,稍有不慎就會出現問題,面對千萬級的日單量,同時還要確保結算金額的準確,這就讓咱們對問題的容忍度變得極低。這也給咱們的資金安全保障形成了巨大的挑戰。下面咱們列舉了一些系統平常運行過程當中出現的問題。網絡
能夠看出,這些都是一些上下游交互的邊界場景,以及遇到的問題。固然不只限於這些場景,凡有系統交互、數據交互邊界的場景,都會出現此類問題,咱們稱之爲「一致性問題」。經粗略統計,咱們清結算系統創建以來有70%左右的問題都屬於一致性問題。架構
致使一致性問題的緣由有不少,諸如:併發
目前配送的日結算金額已達到千萬級別,每一個一致性問題都有可能給咱們整個美團點評形成巨大的損失。所以如何解決系統的一致性問題成爲咱們保障資金安全的重中之重。關於一致性問題,業內已經論述的很是成熟了,搜索引擎中搜索「一致性問題」,隨處可見此概念的定義、問題闡述、意義以及解決思路,諸如:異步
- 強一致性協議: 兩階段提交、三階段提交、TCC (Try-Confirm-Cancel)等
- 最終一致性: 主動輪詢、異步確保、可靠消息、消息事務等
這些手段的目標都是在事中避免問題的發生。可是在實際場景中,不管是系統的內部邏輯仍是外部環境都十分複雜多變、不可預知,咱們很難徹底避免問題。所以過後對於問題數據的發現以及修復就顯得尤其重要。這些也正是咱們這篇文章要論述的「對帳」的核心使命。咱們力求總結對帳領域內最專業的思路和方法,並結合自身的業務特色,建設配送清結算的對帳體系,構築配送資金安全的堅固防線。在系統的整個構建過程當中咱們主要圍繞如下幾個目標:分佈式
下面開始正式介紹美團配送清結算對帳體系的構建經驗。工具
對帳的概念隨着金融、互聯網行業的發展,定義上也經歷了幾個階段的變化,以下:學習
配送結算作爲核心交易履約系統,上游對接了訂單、獎懲、活動等十多個外部系統,下游又承擔了對接支付平臺、財務系統的職責,不只「承上啓下」,並且涉及業務複雜。而系統內部又歷經訂價、計費(清算)、記帳、彙總帳單、付款等多個環節,系統的高度複雜性給對帳的全面性和準確性形成了極大的困難,如圖:
從總體來看,按照時序維度的前後,系統對帳主要分爲三階段的工做。分別是***數據準備***、數據覈對***和***差錯處理。在對帳專業概念中,數據覈對和差錯處理又叫***軋帳***和***平帳***。三個環節緊密相連,從前期準備、問題發現、問題處理三個角度展開對帳工做。
數據準備,顧名思義,咱們須要把對帳所需的所有數據,接入到咱們的對帳系統。該模塊主要實現兩個目標:
在數據接入層,咱們會針對不一樣的數據接入方提供三種不一樣的數據接入模式。
其中第二種方式是咱們最優選擇的,由於數據推送這種形式對於數據接入方來講只須要一次性編寫相關的代碼,按期運行,一勞永逸,減小了人工上傳的成本。對於咱們結算來講,也不須要感知對方的數據格式以及業務邏輯。
數據覈對是對帳中最核心的一個階段。其目標是發現問題數據。數據覈對階段咱們的兩個目標是保障數據覈對的***覆蓋度***和***準確性***。通過總結和梳理,數據覈對過程能夠分爲如下5個環節。
因爲數據覈對的目標是發現問題,那麼咱們進行數據覈對就要從問題出發,首先明確咱們要經過對帳發現哪些問題,只有這樣才能保證數據覈對的覆蓋度。通過梳理,咱們發如今數據流轉中過程當中數據的不一致問題能夠統一歸結爲三類,分別是***漏結***、重複結、錯結。咱們能夠從這三個角度去統一進行問題梳理。下面介紹一下這三種錯誤類型的具體含義。
對帳方式主要分爲兩種,單向對帳***和***雙向對帳。
顯而易見,雙向對帳更可以全面的發現問題。所以在條件容許的狀況下,咱們會優先選擇雙向對帳。
對帳粒度也分爲兩種,分別是***明細對帳***和***總數對帳***。
所以,推薦的作法應該是以明細對帳爲主,定位具體問題。以總數對帳爲輔,對明細對帳的結果進行復核兜底。
對帳口徑,也就是具體的對帳邏輯的設計。咱們會提供固定的***對帳模板***,供不一樣的對帳場景選取。若是某些特殊場景對帳模板不能覆蓋,也能夠採起對帳邏輯***自定義***的方式進行對帳。 通過總結咱們發現,對帳的形式無非就是兩方比對和自身異常檢測兩種。兩方比對又能夠細分爲一對1、多對1、一對多。比對方法也主要是分爲條目匹配和金額匹配。自身異常檢測主要是重複性和異常狀態的檢測。咱們把這些通用的對帳邏輯模板化,減小重複的開發工做。
數據覈對的最後一步就是對帳時機的選擇。分爲***離線對帳***和***在線對帳***。離線對帳主要是經過固定的週期進行對帳。最短週期爲T+1。它的好處是適用性較強,基本能夠覆蓋全部的對帳場景。而在線對帳又分爲***實時對帳***和***準實時對帳***。實時對帳和準實時對帳的區別主要是實時對帳耦合在結算鏈路中,能夠在發現問題數據時,對結算流程進行攔截,而準實時對帳是異步進行的,不具有攔截能力。在線對帳有必定的侷限性,一方面它依賴於對帳數據是否能實時的準備好,另外一方面也比較佔用系統資源。所以咱們的作法應該是以週期對帳爲主,在某些實時性要求比較高,且條件知足的場景使用在線對帳。
差錯處理主要是對數據覈對過程當中發現的問題數據進行處理。咱們會創建一個統一結構的差錯記錄,將數據覈對發現的問題進行統一存儲。差錯記錄中的數據會進行二次覈對,避免因爲日切等緣由形成的問題錯報。對於那些真實存在問題的數據咱們會提供兩種解決模式,若是是常見的問題,且有一套標準的解決方案的話,咱們會把它系統化,採起系統自動修復的方式;若是系統沒法自動修復,那麼咱們會進行系統報警,並進行人工處理。
綜上所述,對帳體系的總體架構,分爲三個模塊,分別是離線對帳平臺,在線對帳平臺和平帳中心。徹底是按照咱們上面的對帳思路設計的。三個模塊互相協做,一體化的完成數據準備、數據覈對、問題處理三部分工做。因爲咱們整個清結算系統是圍繞不一樣的費用項創建的,所以費用項也是咱們設計對帳、執行的對帳一個最小粒度的單元。
具體介紹下三個模塊:
離線對帳分爲三個子模塊,分別是數據接入層、對帳管理層和對帳執行層。
在數據接入層咱們提供拉取和推送兩種模式,經歷一個數據適配的過程,將數據存儲到咱們統一的對帳數據池當中。
在對帳管理層當中,咱們抽象出了一個對帳場景的概念,咱們基於對帳場景進行對帳屬性的配置:首先要選取對帳雙方的數據源;而後進行對帳口徑編輯,這裏提供了自定義和模板選擇兩種方式;最後配置對帳的週期。這裏咱們是經過cron表達式來進行週期配置的。
在對帳執行層,咱們會拉取對帳數據池和對帳核心配置中的相關數據,經歷配置解析,數據抽取,策略執行的過程,最終輸出對帳結果。
下圖左邊是在線對帳平臺的架構圖,右邊是在線對帳的實例。咱們經過RPC、監聽消息隊列(MQ)、監聽數據庫binlog三種方式進行對帳接入。在線對帳平臺分爲管理層和執行層。管理層主要是承擔策略編輯、策略綁定和攔截管理的相關工做。而執行層分爲異步(準實時)對帳和同步(實時)對帳兩個模塊。
右邊兩圖分別是分別是異步對帳和同步對帳的實例。在異步對帳的實例中,是運單和結算單元的對帳。
- 運單是什麼?對應外賣訂單,做爲配送內部的基礎交易數據。
- 結算單元是什麼? 清結算系統內部的模型,和運單是一對一關係,記錄運單各個節點的結算狀態。
①異步對帳:咱們分別監聽運單和結算單元的Binlog,經過Kafka->Storm的經典架構,進行對帳策略的執行。實際的流程比較複雜,這裏只是一張簡圖,大概就是:(細節能夠忽略)
收單運單消息後,咱們會把對於的運單以List的形式存儲到Squirrel(Redis)中,當結算消息來了之後,就把對應運單記錄Delete掉。若是有運單記錄一直停留在List當中,也就是說明結算消息沒有來,應該是發生了漏結算。咱們經過過定時任務輪詢運單List將問題數據輸出。
②同步對帳:示例中是結算內部的流程,經歷結算單、帳單、付款幾個流程。由於付款是最後一個流程,若是這個時候數據存在問題,那麼就會形成實際的資金損失。所以咱們會在付款環節以前,對前面的數據進行對帳。若是發現帳單和結算單的數據不一致,咱們就會進行數據攔截。
在差錯處理階段,咱們會創建一個統一的差錯記錄模型,核心字段包括***對帳場景、對帳批次,數據來源,錯誤類型編碼和數據處理狀態***等。經過定時任務按期輪詢差錯記錄的方式發起差錯處理流程:首先對差錯記錄的數據進行二次覈對,若是二次覈對確認這條數據並無問題,咱們就會回更差錯記錄的處理狀態。若是二次覈對發現數據確實有問題。咱們會提供兩種處理模式。一種是經過系統的手段自動修復。另一種是經過報警的方式,人爲介入。此外咱們還創建了一個問題的人工處理模塊。能夠對一次結算流程的整個生命週期進行回放,並針對特定場景提供一鍵修復的能力。
按照計劃實施後,系統的各個節點都會有行之有效的對帳手段覆蓋,實現資金安全、數據一致性的保障,示意圖:
本篇文章的內容是咱們根據業務的特色,通過長期的思考和外部調研,總結的一套關於對帳的思路以及實施落地方法。目前咱們對帳體系還在分佈實施階段,咱們最終的目標是:
目前外賣配送的單量與日劇增,資金安全所面臨的挑戰愈來愈大。需屢次強調的是:資金安全是一個很大的課題,須要投入大量的時間和精力去系統思考,對帳只是其中一環。咱們目前圍繞資金安全進行了一系列的治理動做,將來還將會繼續增強咱們對於資金安全的理解深度,經過更多的對外交流和學習豐富咱們保障資金安全的手段。
甄超,2015年9月加入美團點評,配送清結算系統核心成員,專一於清結算架構建設、資金安全治理工做。 宏偉,2015年4月加入美團點評,配送清結算系統負責人,參與了美團配送系統建設的全過程。
若是有意向,請發簡歷至 對咱們團隊感興趣,能夠關注咱們的專欄。 美團配送訂單調度、清結算系統長期招聘資深工程師,歡迎各位志同道合、能力優秀的人才加入。簡歷請投遞至:zhanghongwei#meituan.com
原文地址:tech.meituan.com/balanceAcco…