更新於 2024/08/28閱讀時間約 4 分鐘

【💊 Python的解憂錦囊】如何使用Buffer流將檔案分段上傳至Minio

raw-image


MinIO 是一個高性能的物件存儲系統,設計用於大規模的數據存儲需求, 甚至是各種非結構化數據也都能往這邊儲存, 也支持群集擴展, 非常適合正在尋找儲存方案的朋友們。


我們在「【💎 Message Queue - Kafka 案例篇】如何將檔案流上傳到minio - 完整檔案 」介紹了如何從kafka將資料流到minio, 但該篇的主軸在於完整的檔案一次上傳, 這一次我們要來鑽研一下如何模擬本地檔案串流上傳到minio的過程, 接著我們會另外撰寫一篇主題來談談如何結合kafka。


我們今天的主題來談談如何使用Python將檔案「串流」上傳到minio,為什麼要特別提到串流? 主要是隨著時代的演進, 應用逐漸從批次處理轉為即時處理, 使用者體驗逐漸強調「即時」, 而背後的技術從應用程式、訊息佇列、資料庫、儲存媒介也都開始支持「串流功能」, 今天我們將針對「MinIO」這套媒介進行「串流」功能的介紹, 並實際使用「Python」進行展示。


環境準備

這邊我們使用docker來運行minio, 並提供docker compose的配置檔如下:

 minio:
image: minio/minio:latest
container_name: minio
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ACCESS_KEY: minioadmin
MINIO_SECRET_KEY: minioadmin
command: server /data --console-address ":9001"


接著請啟動服務:

docker compose up -d


啟動服務之後我們就準備開始實作囉!


安裝套件

這邊我們需要安裝一下Minio Client才能由客戶端進行檔案上傳。

pip install minio



設定minio連線資訊並創建Bucket

client = Minio(
endpoint='minio:9000',
access_key='minioadmin',
secret_key='minioadmin',
secure=False,
)

bucket_name = 'files'

# 建立儲存桶
if not client.bucket_exists(bucket_name):
client.make_bucket(bucket_name)


設計內部Buffer流

這個內部Buffer流主要做為minio put_object與記憶體之間的檔案封包橋樑, 我們可能會從本地檔案、kafka、遠端伺服器拉取檔案封包, 我們可以將這些檔案封包暫存在我們記憶體實作的I/O流, 讓minio client自動去分塊上傳, 避免大檔案要一次拿取完才能上傳到minio伺服器。


這個Buffer流的實作是關鍵重點的部份, 它就像接水管一樣, 將來源與目的橋接, 順利讓資料流入, 大致上的設計草圖如下:


程式碼如下:



引流並上傳到Minio

我們將上傳到minio的部份用另外一個執行緒去進行, 這是因為我們必須讓讀寫分離才能夠很好的實驗控制的邏輯。


當我們讀完「【💎 Message Queue - Kafka 案例篇】如何將檔案流上傳到minio - 完整檔案 」 都知道上傳的關鍵函數是「put_object」, 它可以接入一條資料水管, 正好將我們設計的資料水管給接入看看。



驗證成功與否

我們試著打開Monitoring → Trace來追蹤上傳的狀況, 這邊我們可以看到每5MB一包為單位進行上傳的過程。



最後上傳成功才會出現檔案如下:



結語

處理部份上傳的部份也真是不容易啊! 過程中不斷的翻閱官方文檔與試誤, 最終勉強的試出一條可以用Buffer流控制分段上傳的實現方案, 也讓我們更深入的了解到put_object的使用方式。


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.