TableStoreWriter是Table StoreJava SDK提供的工具類,封裝了用於高並發、高吞吐率資料匯入的介面,可以實現高並發寫入資料到Table Store資料表,同時支援行層級回調以及自訂配置功能。
背景說明
TableStoreWriter只適用於寬表模型。
為什麼需要TableStoreWriter
在日誌、物聯網(例如軌跡追蹤或溯源)等情境中,裝置會在短時間內產生大量的資料並且使用者需要將裝置資料寫入到資料庫,因此資料庫需要能夠提供高並發、高吞吐率的寫入效能,並滿足每秒上萬行甚至上百萬行的寫入吞吐率,而Table Store的BatchWriteRow介面限制單次只能寫入200行資料。
TableStoreWriter解決了什麼問題
基於上述情境的高並發寫入需求,Table Store提供了一個基於Table StoreJava SDK實現的簡單易用、高效能的資料匯入工具類TableStoreWriter。它封裝了用於高並發、高吞吐率資料匯入的介面,可以實現高並發寫入資料到Table Store資料表。同時支援行層級回調以及自訂配置功能。
應用情境
如果您的業務情境同時具備以下特點,則您可以使用TableStoreWriter寫入資料到Table Store中。
高並發,對吞吐率要求很高
對單條資料的寫入延遲沒有要求
寫入可非同步化(可採用生產者消費者模型)
同一條資料可重複寫入
典型的應用情境如下:
日誌儲存
日誌儲存具有海量資料存放區、高吞吐率、可非同步化處理等特點,可以使用TableStoreWriter實現高並發、高吞吐資料寫入,並且重複寫入不會影響日誌資料的正確性。
訊息系統
訊息系統,例如即時通訊,需要支援海量訊息處理(例如群聊訊息的寫入放大),要求高吞吐率,而且對單條訊息的延遲容忍度較高,可接受百毫秒級的延時。訊息處理可以完全非同步進行,此外,由於每條訊息都帶有唯一ID且內容不可更改,因此支援重複寫入而不引發問題。在訊息系統中使用Table Store進行資料存放區時,您可以通過TableStoreWriter快速寫入資料到Table Store中。
分布式隊列消費
分布式隊列在複雜的分布式系統中應用廣泛,不僅提供高效能的訊息傳遞,還能解耦模組間的依賴,簡化系統架構。
如果您的業務架構中使用了分布式隊列,並且其中一個消費者任務是將資料匯入到Table Store,那麼可以考慮採用TableStoreWriter。TableStoreWriter基於生產者-消費者模型,適用於與分布式隊列類似的情境。
架構詳解
TableStoreWriter是基於SDK處理層介面重新封裝的工具類,它與Table StoreJava SDK的關係如下:
TableStoreWriter依賴Table StoreJava SDK提供的AsyncClient非同步介面。
TableStoreWriter匯入資料使用Table StoreJava SDK的BatchWriteRow介面。
TableStoreWriter的單行異常重試依賴Table StoreJava SDK的RetryStrategy。
代碼分層架構如下圖所示。
TableStoreWriter實現和封裝細節如下圖所示。您也可以使用Table StoreJava SDK原有的介面實現資料寫入,但TableStoreWriter在介面效能和易用性上都做了最佳化,具備以下特性:
使用非同步介面:使用更少的線程,提供更高的並發。
自動資料彙總:在記憶體中使用緩衝隊列,讓一次發給Table Store的批量寫請求盡量大,提高寫入吞吐率。
採用生產者消費者模式:更易於非同步化和資料聚集。
使用高效能資料交換隊列:選用Disruptor RingBuffer,採用多生產者單消費者的模型,提供更好的效能。
屏蔽複雜請求封裝:屏蔽調用BatchWriteRow介面細節,通過預檢查自動過濾髒資料(例如主鍵格式與表預定義的不符、行大小超限、行列數超限等),自動處理要求節流(例如一次批量的行數限制、一次批量的大小限制等)。
行層級Callback:相對於Table StoreJava SDK提供的請求層級的Callback,TableStoreWriter提供行層級的Callback,讓商務邏輯可以實現行層級資料處理。
行層級重試:請求層級重試失敗會根據特定的錯誤碼進行行層級重試,最大程度保證資料寫入成功率。
後續操作
如果您想體驗TableStoreWriter,請參考樣本使用TableStoreWriter並發寫入資料。