全部產品
Search
文件中心

Tablestore:資料消費架構原理

更新時間:Jul 23, 2024

Tunnel Client為通道服務的自動化資料消費架構。使用通道服務前,需要瞭解Tunnel Client的自動化資料處理流程、自動化的負載平衡和良好的水平擴充性以及自動化的資源清理和容錯處理。

背景資訊

Tunnel Client可以解決全量和增量資料處理時的常見問題,例如負載平衡、故障恢複、Checkpoint、分區資訊同步確保分區資訊消費順序等。使用Tunnel Client後,您只需要關心每條記錄的處理邏輯。

Tunnel Client的代碼詳情請參見Github

自動化資料處理流程

Tunnel Client通過每一輪的定時心跳探測(Heartbeat)進行活躍Channel的探測,Channel和ChannelConnect狀態的更新,和資料處理任務的初始化、運行和結束等。

  1. Tunnel Client資源的初始化

    1. 將Tunnel Client狀態由Ready置為Started。

    2. 根據TunnelWorkerConfig中的HeartbeatTimeout和ClientTag(用戶端標識)等配置進行ConnectTunnel操作,並和Tunnel服務端進行聯通,以擷取當前Tunnel Client對應的ClientId。

    3. 初始化ChannelDialer,用於建立ChannelConnect。

      每一個ChannelConnect都會和一個Channel一一對應,ChannelConnect上會記錄有資料消費的位點。

    4. 根據使用者傳入的處理資料的Callback和TunnelWorkerConfig中CheckpointInterval(向服務端記資料位元點的間隔)封裝出一個帶自動記Checkpoint功能的資料處理器。

    5. 初始化TunnelStateMachine,用於進行Channel狀態機器的自動化處理。

  2. 固定間隔進行Heartbeat

    心跳的間隔由TunnelWorkerConfig中的heartbeatIntervalInSec參數決定。

    1. 進行Heartbeat請求,從Tunnel服務端擷取最新可用的Channel列表,Channel中會包含有ChannelId、Channel的版本和Channel的狀態資訊。

    2. 將服務端擷取到的Channel列表和本地記憶體中的Channel列表進行Merge,然後進行ChannelConnect的建立和update,規則如下:

      • Merge:基於本輪從服務端擷取的最新Channel列表,對於相同ChannelId,認定版本號碼更大的為最新狀態,直接進行覆蓋,對於未出現的Channel,則直接插入。

      • 建立ChannelConnect:如果此Channel未建立其對應的ChannelConnect,則會建立一個WAIT狀態的ChannelConnect,如果對應的Channel狀態為OPEN狀態,則同時會啟動該ChannelConnect上處理資料的迴圈流水線任務(ReadRecords&&ProcessRecords),處理詳情請參見代碼中的ProcessDataPipeline類。

      • Update已有ChannelConnect:Merge完成後,如果Channel對應的ChannelConnect存在,則根據相同ChannelId的Channel狀態來更新ChannelConnect的狀態,例如Channel為CLOSE狀態也需要將ChannelConnect的狀態置為Closed,進而終止處理任務的流水線任務,詳情請參見代碼中的ChannelConnect.notifyStatus方法。

  3. Channel狀態自動機說明

    在心跳模式下,Tunnel服務端會根據保持心跳的Tunnel Client數量,調度可以消費的分區到不同Tunnel Client上,以達到負載平衡的目的。

    Tunnel服務端通過Channel狀態機器來驅動每個Channel的消費以及進行負載平衡,如下圖所示。

    Tunnel服務端和Tunnel Client通過一個心跳和Channel版本號碼更新機制進行狀態變換通訊。

    1. 每個Channel最初均處於WAIT狀態。

    2. 增量類型Channel需要等待父分割上Channel消費完畢轉為TERMINATED後才可以轉為可消費狀態OPEN。

    3. OPEN狀態的分區會調度到各個Tunnel Client上。

    4. 在需要負載平衡時,Tunnel服務端和Tunnel Client有一個Channel狀態OPEN->CLOSING->CLOSED的調度協議,Tunnel Client在消費完一個全量Channel split或者發生了分裂的增量Channel後,會將Channel彙報為TERMINATED。

    Channel 狀態自動機

自動化的負載平衡和良好的水平擴充性

  • 運行多個Tunnel Client對同一個Tunnel(TunnelId相同)進行消費時,在Tunnel Client執行Heartbeat時,Tunnel服務端會自動對Channel資源進行重分配,讓活躍的Channel儘可能的均攤到每一個Tunnel Client上,達到對資源進行負載平衡的目的。

  • 在水平擴充性方面,可以通過增加Tunnel Client的數量來完成,Tunnel Client可以在同一個機器或者不同機器上。

自動化的資源清理和容錯處理

  • 資源清理:當Tunnel Client沒有被正常shutdown時(例如異常退出或者手動結束),會自動進行資源回收,包括釋放線程池、自動調用在Channel上註冊的shutdown方法、關閉Tunnel串連等。

  • 容錯處理:當Tunnel Client出現Heartbeat逾時等非參數類錯誤時,Table Store會自動Renew Connect,以保證資料消費可以穩定的進行持續同步。