<output id="brrn1"><ruby id="brrn1"></ruby></output>
<sub id="brrn1"></sub>
    <sub id="brrn1"></sub>

      <sub id="brrn1"><ruby id="brrn1"><noframes id="brrn1"><big id="brrn1"><del id="brrn1"></del></big>

      <th id="brrn1"><ruby id="brrn1"></ruby></th>

          <delect id="brrn1"><meter id="brrn1"></meter></delect>
        
        

          <output id="brrn1"></output>

            開發

            杭州銀行批量交易平臺(HZBAT)技術內幕

            廣告
            廣告

            1  概述

            杭州銀行批量交易平臺(HZBAT)是我基于DC4C自研的面向批量交易的技術平臺。DC4C是我在2015年完全獨立自研的分布式批量計算框架。

            目前HZBAT已用于綜合積分系統(2015年投產)、ECIF系統(2017年投產),以及在2018年加入同事潘平原一起改造優化后實施于杭州銀行核心業務系統的日終批量交易平臺,穩定運行至今。

            2  分布式批量計算框架(DC4C)

            2015年4月,我在開發爬蟲項目需要平臺化、配置化的并發調度框架,搜尋了開源社區以及阿里等大廠都沒有對應的技術產品可用,遂自己將調度邏輯抽象出來,借鑒分布式設計思想,充分考慮集群高可用和敏捷伸縮,花了一個多月完全獨立設計自研了一套分布式批量計算框架,取名為DC4C

            DC4C是一個中介代理模式、動態自治、高可用易伸縮的分布式批量計算框架,也是業界最早實現有向無環圖任務調度引擎的分布式計算框架之一。

            DC4C內核完全用C編寫,版本’1.5.5’時手工代碼約一萬行,此外大量代碼使用我的開源工具DirectStruct自動化技術生成,大幅減少了開發量,提高了開發效率,減輕了底層細節編碼壓力。

            DC4C不依賴其它任何第三方代碼、庫和系統,只依賴我開源的極速JSON解析庫fasterjson,已包含在DC4C源碼內。

            2.1. 體系架構

            DC4C體系架構包含基礎平臺架構、API包和任務調度引擎庫。

            2.1.1. 基礎平臺架構

            architecture.png

            DC4C提供了一個分布式基礎設施,包含負責中介的注冊節點(rserver)、負責業務邏輯處理的計算節點組(wserver)、負責任務分派和調度的用戶節點API(dc4c_user_api),構建了分布式集群管理和批量任務分派調度管理體系。在任務分派API基礎上又封裝了調度引擎庫,自研了有向無環圖任務調度引擎(dc4c_tfc_dag_api)。

            DC4C用戶節點API包可用其它語言編寫以適配使用者公司的技術棧,計算節點應用目前只支持裝載可執行程序和動態庫,可擴展改造支持其它執行模式。

            2.1.1.1. 注冊節點

            注冊節點為父子進程結構,父進程負責監控子進程異常時重啟子進程,子進程負責接受計算節點的注冊、狀態變更、注銷,接受用戶節點API查詢空閑計算節點信息,接口支持TCPHTTP/HTML兩種方式。

            注冊節點最多可部署8套,提高計算節點注冊信息的冗余性,保證系統高可用。

            2.1.1.2. 計算節點

            計算節點為三級進程結構,管理進程創建一組工作進程,并監控工作進程異常時重啟工作進程,每個工作進程都有一個唯一的偵聽網絡地址(起始端口號+工作進程編號),每個工作進程再創建一個執行進程作為其關聯進程。

            工作進程負責向注冊節點注冊、狀態變更、注銷,負責接受用戶節點的任務分派請求、聯動下發任務程序、傳遞任務命令給執行進程、反饋任務結果。工作進程與注冊節點保持長連接并周期性交換心跳。工作進程接收到任務時會檢查比較用戶節點的任務程序和本地的是否一致,如果不一致會聯動發起下發任務程序請求,最后再傳遞任務給執行進程執行。工作進程管理同一時間只有一個任務正在執行,如果有額外的用戶節點連接進來則立即響應告知。

            執行進程負責接收任務命令行,裝載、執行任務程序。

            2.1.1.3. 用戶節點

            用戶節點由用戶進程組成,用戶代碼調用用戶節點API包實現向注冊節點查詢空閑計算節點、向計算節點分派任務。

            2.1.2. API包

            2.1.2.1. 用戶節點API包

            用戶節點API包供用戶節點進程調用,負責查詢計算集群中空閑節點、分派任務,并監督任務執行。

            用戶節點API包括單任務分派API集、批任務分派API集和多批任務分派API集。

            用戶節點API還提供了開始、結束、取消事件鉤子,以便于在批量前后、任務前后自動觸發用戶自定義的代碼邏輯,比如更新數據庫中的任務狀態。

            2.1.2.2. 計算節點API包

            計算節點API包用于計算節點執行進程與任務程序之間的信息交互。

            2.1.3. 任務調度引擎庫

            任務調度引擎用于用戶節點,是基于用戶節點API包的再高層封裝。

            目前引擎庫提供有有向無環圖任務調度引擎。

            2.1.3.1. 有向無環圖任務調度引擎API

            DAG.png

            有向無環圖是一種圖結構,圖中所有圖節點都有前序、后序方向關系,且從開始圖節點開始,期間經歷分拆和合攏,最后匯合至結束圖節點。有向無環圖節點之間都是有向且不能構成環。

            dag_task_engine.png

            有向無環圖任務調度引擎讀取JSON配置文件填充中間數據結構,再構造有向無環圖內部結構,然后按有向無環圖節點前序后繼關系,依次執行所有批量,每個批量由一組任務組成,批量內任務呈列表結構,從上到下執行。引擎還提供直接接收中間數據結構接口,以便于用戶自行編寫從自定義配置源(如數據庫)到中間數據結構的邏輯。

            有向無環圖任務調度引擎內部做了眾多執行優化,比如執行前處理會對每一條圖節點鏈路計算評分,執行時根據評分均衡每條鏈路的優先權重,實現執行總時間最小化。

            2.2. 重要流程

            2.2.1. 計算節點注冊流程

            compute_node_registe_flow.png

            計算節點管理進程創建一組工作進程,工作進程創建自己的關聯執行進程后,與注冊節點建立TCP長連接,附帶服務器信息,發送注冊請求。請求被接受后,周期性交換心跳。

            worker_info_strategy.png

            注冊節點會把每一個計算節點工作進程的注冊請求都緩存起來,掛接成三級鏈表“主機類型”(OS版本號位數)-“主機”(IP)-“工作進程”(PORT)。

            當收到注銷或者長連接斷開就刪除對應工作進程鏈表節點,如果工作進程鏈表為空則連帶刪除主機鏈表節點,如果主機鏈表為空則連帶刪除主機類型鏈表節點。

            當收到用戶節點API的查詢空閑計算節點請求時,根據上送的主機類型條件,挑選若干個工作負載最輕的主機,選擇若干個空閑的計算節點工作進程信息返回給用戶節點,移動該工作進程鏈表節點到最后,以均衡負載。

            2.2.2. 用戶節點分派任務流程

            user_node_dispatch_task_flow.png

            用戶節點用戶應用要分派一個任務時,調用用戶節點API。

            API首先與注冊節點建立TCP連接,附帶服務器信息,發送查詢請求到注冊節點,注冊節點根據篩選條件和負載策略返回指定數量的計算節點網絡地址信息給用戶節點API,然后API連接計算節點并發送執行任務請求,計算節點根據收到的任務程序散列值和本地的比較,如果一致則去執行,如果不一致則聯動請求用戶節點API下發任務程序,最后工作進程傳遞任務相關信息給執行進程執行。

            工作進程把任務命令行傳遞給執行進程時,也向注冊節點發送狀態變更通知,把自己切換為忙碌狀態。

            執行進程結束執行后,傳遞結果給工作進程,工作進程把執行結果轉交給用戶節點,也向注冊節點發送狀態變更通知,把自己切換為空閑狀態。

            用戶應用還能通過調用用戶節點API分派一批或多批任務,并在超時時間內等待所有任務分派到計算節點執行完成返回,或發生錯誤后根據設置決定是否優雅中斷。

            2.2.3. 任務狀態遷徙

            可靠性是考驗一個分布式系統架構設計的重要考量,DC4C架構中,一個任務在分派、傳遞、執行、響應的任何過程中都可能發生異常。

            由于任務的接收執行和計算節點狀態變更通知是異步的,有可能用戶節點向注冊節點拿到的計算節點狀態與實際不符,所以用戶節點連接分派任務給計算節點時,可能會收到該計算節點忙碌響應,用戶節點API將迭代再次向注冊節點查詢。

            task_status_migration.png

            每個任務在系統間流轉時都會有一個任務狀態來跟蹤之,當一個任務被選中分派前,其狀態從INIT轉換為USER_EXECUTING,發送給計算節點且接受任務時,其狀態從USER_EXECUTING轉換為WSERVER_EXECUTING,執行進程執行完傳遞回工作進程時,其狀態從WSERVER_EXECUTING轉換為WSERVER_FINISHEDWSERVER_FINISHED_WITH_ERROR,響應回用戶節點后,其狀態轉換為USER_FINISHEDUSER_FINISHED_WITH_ERROR

            當任務執行中崩潰時,工作進程能在第一時間感知到,代異常結束的執行進程響應回用戶節點,用戶節點API修改狀態為USER_FINISHED_WITH_DOUBT。可疑狀態需要人工介入查證。

            當任務執行時間過長或陷入死循環,用戶節點API會強行斷開與計算節點的連接,修改狀態為USER_FINISHED_WITH_DOUBT。可疑狀態需要人工介入查證。

            任務狀態在流轉中,如果使用者設置了每個任務或每個批量的事件鉤子,將獲得調度中自定義處理狀態的機會,比如更新數據庫。

            2.3. 高可用

            2.3.1. 當注冊節點崩潰

            當注冊節點子進程崩潰時,用戶節點和計算節點立即偵測到與之連接異常,轉而連接其它注冊節點,因其它注冊節點擁有相同的冗余計算節點注冊信息,不影響用戶節點和計算節點工作。注冊節點父進程立即偵測到子進程崩潰后會重啟該進程。

            當注冊節點父進程崩潰時,子進程也會結束,其它注冊節點擁有冗余計算節點注冊信息提供給集群提供服務。

            2.3.2. 當注冊節點僵死

            當注冊節點子進程僵死時,計算節點通過心跳發現異常,強制斷開并轉而連接其它注冊節點,用戶節點與之通訊超時,轉而連接其它注冊節點。注冊節點父進程不會偵測到子進程異常,但該節點被孤立,所有錯誤日志指向該節點,便于手工定位和處置。

            當注冊節點父進程僵死時,不影響子進程工作。

            2.3.3. 當計算節點崩潰

            當計算節點工作進程崩潰時,注冊節點立即偵測到與之連接異常,斷開等待其重啟后重連。用戶節點立即偵測與之連接異常,如果設置了忽略錯誤選項,重新向注冊節點查詢其它空閑計算節點,分派任務,否則進入優雅結束流程,人工介入處理。計算節點管理進程立即偵測到工作進程崩潰,重啟該進程。

            當計算節點執行進程崩潰時,工作進程會發送可疑狀態回用戶節點,然后重啟執行進程,在未重啟完成前拒絕所有用戶節點執行任務請求,因為集群允許注冊節點里計算節點狀態與真實計算節點狀態不一致,且注冊節點把查詢過的計算節點信息移到鏈表最后面并一定時間內不允許再查詢,該計算節點在未準備好執行進程前不會被高頻騷擾。

            當計算節點管理進程崩潰時,不影響其它進程工作。

            2.3.4. 當計算節點僵死

            當計算節點工作進程僵死時,注冊節點通過心跳發現異常,強制斷開并等待重連,用戶節點與之通訊超時,如果設置了忽略錯誤選項,重新向注冊節點查詢其它空閑計算節點,分派任務,否則進入優雅結束流程,人工介入。計算節點管理進程不會偵測到子進程異常,但該節點被孤立,所有錯誤日志指向該節點,便于手工定位和處理。

            當計算節點執行進程僵死時,用戶節點首先會超時,如果設置了忽略錯誤選項,重新向注冊節點查詢其它空閑計算節點,分派任務,否則進入優雅結束流程,人工介入。

            當計算節點管理進程僵死時,不影響其它進程工作。

            2.3.5. 當用戶節點崩潰

            當用戶節點用戶程序進程崩潰時,計算節點工作立即偵測到當前執行任務的用戶節點斷開連接,但不影響執行進程處理,后續需要人工介入。

            2.3.6. 當用戶節點僵死

            當用戶節點用戶程序進程僵死時,計算節點工作進程等待執行進程結束,發送執行完成響應給用戶節點,然后等待其他用戶節點任務。

            2.4. 高可靠

            DC4C基于任務狀態實現高可靠能力。當調度偵測到系統或應用失敗而引發優雅結束后,再次啟動時會檢查未決任務的狀態:如果用戶節點為中間狀態但計算節點為結束狀態,以計算節點修正用戶節點狀態;明確失敗狀態重置成初始狀態以便重新執行;如果存在可疑狀態,拒絕啟動,等待人工介入查證后修正狀態。

            2.5. 敏捷伸縮

            2.5.1. 熱擴大集群

            需要新增計算節點,只需在新加入主機或已有主機內,啟動新計算節點組,查詢日志和查詢注冊節點確認加入成功后,自然有用戶節點會查詢到并分派任務過來。

            2.5.2. 熱縮小集群

            當需要刪除計算節點時,只需向目標計算節點組的管理進程發送中止信號TERM,管理進程轉發信號給工作進程組,沒有任務的工作-執行進程組立即結束,有任務執行的工作進程關閉網絡服務,等待執行進程任務完成后再結束,整個縮小集群過程不影響正在處理的任務。

            2.6. 功能和優勢

            • 對于應用開發人員,無需編寫任何并發控制細節代碼(如forkwait)就可輕松實現本地或集群的并發管理,以及本地風格(wait子進程退出值status)的執行反饋。計算節點用戶應用本身就是可執行程序,便于本地調試。
            • 對于系統運維人員,隨時根據當前系統負載熱伸縮(擴大或減小)集群規模,而不影響系統的功能性,更無需應用開發人員參與。集群伸縮無需重啟等影響當前正在處理的任務。沒有配置文件,大大減少運維復雜度,實現高伸縮性。目前熱伸縮只能手工觸發。
            • 通過網絡連接心跳、父子進程監控、數據冗余、任務狀態遷徙等實現架構高可靠高可用。
            • 用戶API包提供了單任務分派、批量任務分派、多批量任務分派等高層封裝API,也提供了低層API供用戶自己封裝適應自己應用場景的任務分派器。用戶API包也提供了同步、多路復用等分派模式,支持各種場景的用戶代碼結構。
            • 實現了一個有向無環圖任務調度引擎,是業界最早實現該數據結構任務調度引擎的分布式計算框架之一。
            • 用戶節點API和計算節點有自動檢查應用版本和自動集群應用部署機制。
            • 支持telnet或網頁查詢、管理集群狀態。

            3 杭州銀行批量交易平臺(HZBAT)

            3.1. 與DC4C的關系

            hzbat_and_dc4c.png

            杭州銀行批量交易平臺HZBAT(下面簡稱HZBAT)是基于分布式批量計算框架DC4C研發而成。

            HZBAT建立“階段-批量-任務”三級調度模型,調DC4C用有向無環圖任務調度引擎API實現銀行批量交易調度處理。

            主控管理程序hzbat調用DC4C調度引擎庫中的有向無環圖調度引擎API,作為用戶節點,向注冊節點查詢空閑計算節點信息,下發任務程序和分派任務給計算節點,計算節點執行進程裝載、執行任務程序。

            HZBAT依靠DC4C實現隨時熱伸縮集群而不影響正在處理的批量交易,無基礎設施配置文件模式減輕了運維人員工作,通過連接心跳、進程監控、狀態冗余(部署多注冊節點)等實現高可靠高可用,基于有向無環圖任務結構大大豐富批量任務并發配置的靈活度,整個框架自帶交易程序自動更新機制。

            3.2. “階段”-“批量”-“任務”三級調度對象

            HZBAT基于DC4C把調度對象分為“階段”-“批量”-“任務”三級。

            任務是最小執行單元,一個任務即一個執行命令行(有直接執行命令行和動態庫加參數兩種模式),即一個執行進程。在DC4C有向無環圖調度引擎中,任務被分發到DC4C分布式集群(計算節點群組)中空閑的計算節點上,由該計算節點執行進程執行該命令行、監控執行過程、反饋執行結果(進程返回值)回用戶節點(任務分發方)。

            批量由一組任務構成,任務之間平等沒有優先級,一般按任務列表順序分派和執行。

            計劃即有向無環圖批量集合,每個批量是該圖上的一個節點,批量與批量之間有先后依賴關系,只有所有前序批量都執行完成后才能開啟后繼批量。

            schedule_list.png

            整個銀行日終批量分為五個階段:日終日切日結日初報表,季末在日初后會有季度結息階段。出于管理需要,每個階段手工觸發。

            batch_dag_in_schedule.png

            task_list_in_batch.png

            每個階段由一棵有向無環圖組成,每個圖節點是一個批量,每個批量由組任務列表組成。

            平臺主控管理程序hzbat從數據庫中讀取階段信息、批量信息、批量前序后繼關系信息、靜態任務信息、批量過濾信息,填充中間數據結構,調用有向無環圖調度引擎API,引擎調用DC4C用戶節點API,控制執行階段、批量和任務。當階段開始結束時、批量開始結束時、任務開始結束時,編寫回調函數掛接到調度引擎事件鉤子中,實現回寫更新狀態、記錄結果等功能。

            主控管理程序hzbat還支持單批量、單階段、自動階段組執行,便于本地化調試。

            3.3. 靜態任務和動態任務

            預先配置在數據庫任務表中的任務稱為靜態任務,每天不變的任務按靜態任務預置。

            每天都可能變化的任務稱為動態任務,動態任務不配置在任務表中,在每個階段開始時,會先執行所有批量的準備任務,準備任務讀入業務數據,拆分并行維度,生成動態任務并登記到任務表中,然后再按有向無環圖結構執行所有批量在任務表中的任務,包括靜態任務。

            3.4. 批量過濾

            有些批量只有在特定的時間才能執行,hzbat加入數據庫批量過濾表,實現批量過濾機制。

            目前過濾類型有每月指定日執行(含自適應月初月末)、按每年指定月日執行、按每周星期幾執行三種類型。同一種類型可配置一個或多個值,如每月的10日、20日執行,如每周的周一、周三、周四執行。

            3.5. 主要數據庫表結構

            db_schema.png

            3.6. 最佳實踐

            在長期使用HZBAT中,總結出一套最佳實踐,指導平臺配置管理員、架構師、開發工程師等使用者產生最優使用效果。

            3.6.1. 基礎設施規劃

            一般部署兩個注冊節點即可實現一定程度的高可用能力,如果有更高要求,可部署更多。

            多數據中心可部署多套注冊節點和計算節點,多活工作。唯有用戶節點由用戶保證主備機制。

            當集群過大時,注冊節點的連接和心跳壓力較大,建議注冊節點單獨部署服務器。

            3.6.2. 批量任務顆粒度

            批量交易往往數量較少、運行時間較長,交易開發人員在規劃批量交易時要注意任務的顆粒度不能太小,比如生成多幣種報表,不能一個幣種一個任務,時間就大量耗費在的調度中,最佳實踐建議一般來說人民幣按機構拆分任務,外幣整合成一個任務,每個任務盡量耗時均等,總處理時間最小化。

            3.6.3. 批量圖結構設計

            調度引擎按有向無環圖結構執行階段中的所有批量,規劃圖結構(即批量的前序后繼關系)時盡量發散鏈路,不要設計過多的匯合節點,因為匯合節點會約束下級批量開始,影響系統資源充分利用,導致總時間增加。

            3.6.4. 監控

            階段、批量、任務表中有開始日期時間和狀態等信息,可與監控平臺對接,結合歷史信息進行基準分析,當某個任務執行時間過長時立即告警,人工介入核查。

            4  最后

            厲華,主手C,寫過性能卓越方便快捷的開源日志庫,比肩世界最快的JSON、XML、HTTP開源解析器,占用系統資源極小的開源日志采集器等,自研銀行核心聯機交易平臺、批量交易平臺、全組件化配置化的前置框架等,分布式系統實踐者,容器技術專研者,目前在杭州銀行信息技術部負責基礎架構團隊。

            原文鏈接:https://mp.weixin.qq.com/s/p70-Ng2vqtZ1LJGkNy1fSA

            最干貨的java+分布式技術公眾號,兼及研發管理。本號專家陣容:螞蟻金服右軍、易寶CTO陳斌、米么金服總監李偉山、奧琪金科首席架構曲健、螞蟻金服高級技術專家張翔、美團高級技術專家楊彪等。

            第六屆4.29首都網絡安全日 那些不容錯過的精彩瞬間

            上一篇

            新華三計算與存儲為“數字大腦”擔當堅實基底

            下一篇

            你也可能喜歡

            杭州銀行批量交易平臺(HZBAT)技術內幕

            長按儲存圖像,分享給朋友

            ITPUB 每周精要將以郵件的形式發放至您的郵箱


            微信掃一掃

            微信掃一掃
            亚洲黄色片视频,光棍电影韩国伦理网,女神吧,伊人电影在线观看