欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloud大文件分片斷點上傳實現(xiàn)原理

 更新時間:2020年05月09日 09:44:54   作者:Xproer-松鼠  
這篇文章主要介紹了SpringCloud大文件分片斷點上傳實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1背景

用戶本地有一份txt或者csv文件,無論是從業(yè)務數(shù)據(jù)庫導出、還是其他途徑獲取,當需要使用螞蟻的大數(shù)據(jù)分析工具進行數(shù)據(jù)加工、挖掘和共創(chuàng)應用的時候,首先要將本地文件上傳至ODPS,普通的小文件通過瀏覽器上傳至服務器,做一層中轉便可以實現(xiàn),但當這份文件非常大到了10GB級別,我們就需要思考另一種形式的技術方案了,也就是本文要闡述的方案。

技術要求主要有以下幾方面:

支持超大數(shù)據(jù)量、10G級別以上

穩(wěn)定性:除網(wǎng)絡異常情況100%成功

準確性:數(shù)據(jù)無丟失,讀寫準確性100%

效率:1G文件分鐘級、10G文件小時級

體驗:實時進度感知、網(wǎng)絡異常斷點續(xù)傳、定制字符特殊處理

2文件上傳選型

文件上傳至ODPS基本思路是先文件上傳至某中轉區(qū)域存儲,然后同步至ODPS,根據(jù)存儲介質可以分為兩類,一類是應用服務器磁盤,另一類類是中間介質,OSS作為阿里云推薦的海量、安全低成本云存儲服務,并且有豐富的API支持,成為中間介質的首選。而文件上傳至OSS又分為web直傳和sdk上傳兩種方案,因此上傳方案有如下三種,詳細優(yōu)缺點對比如下:

螞蟻的文本上傳功能演進過程中對第一種、第二種方案均有實踐,缺點比較明顯,如上表所述,不滿足業(yè)務需求,因此大文件上傳終極方案是方案三。

3整體方案

以下是方案三的整體過程示意圖。

請求步驟如下:

用戶向應用服務器取到上傳policy和回調設置。

應用服務器返回上傳policy和回調。

用戶直接向OSS發(fā)送文件上傳請求。
等文件數(shù)據(jù)上傳完,OSS給用戶Response前,OSS會根據(jù)用戶的回調設置,請求用戶的服務器。如果應用服務器返回成功,那么就返回用戶成功,如果應用服務器返回失敗,那么OSS也返回給用戶失敗。這樣確保了用戶上傳成功,應用服務器已經(jīng)收到通知了。

應用服務器給OSS返回。

OSS將應用服務器返回的內(nèi)容返回給用戶。

啟動后臺同步引擎執(zhí)行oss到odps的數(shù)據(jù)同步。

同步實時進度返回返回給應用服務器,同時展示給用戶。

4技術方案

4.1上傳

OSS提供了豐富的SDK,有簡單上傳、表單上傳、斷點續(xù)傳等等,對于超大文件提供的上傳功能建議采用斷點續(xù)傳方式,優(yōu)點是可以對大文件并行分片上傳,利用OSS的并行處理能力,中間暫停也可以從當前位置繼續(xù)上傳,網(wǎng)絡環(huán)境影響可以降到最低。

4.2下載

OSS文件下載同樣也有多種方式,普通下載、流式下載、斷點續(xù)傳下載、范圍下載等等,若直接下載到本地同樣建議斷點續(xù)傳下載,但我們的需求并不僅僅是下載文件本地存儲,而是讀取文件做數(shù)據(jù)從OSS到ODPS的同步,因此不做中間存儲,直接邊讀變寫,一方面采用OSS流式讀取,一方面ODPS tunnel上傳,用多線程讀寫方式提高同步速率。

4.3兩階段數(shù)據(jù)轉移

文件從本地到ODPS可以分為兩個階段,第一階段前端分片斷點續(xù)傳將本地文件上傳至OSS,第二階段后端流式讀寫將數(shù)據(jù)從OSS同步至ODPS,如下圖所示:

涉及技術點:

4.3.1前端,js sdk帶STS token 安全上傳

在需要上傳的文件較大時,可以通過multipartUpload接口進行分片上傳。分片上傳的好處是將一個大請求分成多個小請求來執(zhí)行,這樣當其中一些請求失敗后,不需要重新上傳整個文件,而只需要上傳失敗的分片就可以了。一般對于大于100MB的文件,建議采用分片上傳的方法,每次進行分片上傳都建議重新new一個新的OSS實例。

阿里云分片上傳流程主要會調用3個api,包含

InitiateMultipartUpload, 分片任務初始化接口。

UploadPart,單獨的分片上傳接口。

CompleteMultipartUpload, 分片上傳完成后任務完成接口

臨時訪問憑證是通過阿里云Security Token Service(STS)來實現(xiàn)授權的一種方式。其實現(xiàn)請參見STS Java SDK。臨時訪問憑證的流程如下:

客戶端向服務器端發(fā)起獲得授權的請求。服務器端先驗證客戶端的合法性。如果是合法客戶端,那么服務器端會使用自己的AccessKey來向STS發(fā)起一個請求授權的請求,具體可以參考訪問控制。

服務器端獲取臨時憑證之后返回給客戶端。

客戶端使用獲取的臨時憑證來發(fā)起向OSS的上傳請求,更詳細的請求構造可以參考臨時授權訪問??蛻舳丝梢跃彺嬖搼{證用來上傳,直到憑證失效再向服務器端請求新的憑證。

4.3.2后端,多線程流式讀寫

OSS端:如果要下載的文件太大,或者一次性下載耗時太長,可以多線程流式下載,一次處理部分內(nèi)容,直到完成文件的下載。
ODPS端:tunnel sdk對OSS流式數(shù)據(jù)直接寫入,一次完整的數(shù)據(jù)寫入流程通常包括以下步驟:
先對數(shù)據(jù)進行劃分;

為每個數(shù)據(jù)塊指定 block id,即調用 openRecordWriter(id);

然后用一個或多個線程分別將這些 block 上傳上去, 并在某個 block 上傳失敗以后,需要對整個 block 進行重傳;

在所有 block 都上傳以后,向服務端提供上傳成功的 blockid list 進行校驗,即調用 session.commit([1,2,3,…])
而由于服務端對block管理,連接超時等的一些限制,上傳過程邏輯變得比較復雜,為了簡化上傳過程,SDK提供了更高級的一種RecordWriter——TunnelBufferWriter。

5總結

實測結果顯示,本文的上傳方案實現(xiàn)了第一節(jié)提出的幾點技術要求,如下:

支持超大數(shù)據(jù)量、10G級別以上沒有任何壓力,主要是前端在分片上傳設置好分片限額即可(最大10000片,每片最大100G),目前設置每片1M滿足10G需求。

穩(wěn)定性:實測觀察網(wǎng)絡異常情況較少,文件內(nèi)容正常情況下100%成功。

準確性:實測數(shù)據(jù)無丟失,讀寫準確性100%。

效率:辦公網(wǎng)帶寬1.5M/s的情況下1G文件分鐘級、10G文件小時級,實際速度視用戶端的當前網(wǎng)絡帶寬變化。

體驗:實時進度感知、網(wǎng)絡異常斷點續(xù)傳、定制字符特殊處理等高級功能可以提升用戶體驗。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • SpringBoot整合ElasticSearch實踐

    SpringBoot整合ElasticSearch實踐

    本篇文章主要介紹了SpringBoot整合ElasticSearch實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 通過一個map替換字符串中指定的字符變量方法

    通過一個map替換字符串中指定的字符變量方法

    下面小編就為大家?guī)硪黄ㄟ^一個map替換字符串中指定的字符變量方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java中final修飾的方法是否可以被重寫示例詳解

    Java中final修飾的方法是否可以被重寫示例詳解

    這篇文章主要給大家介紹了關于Java中final修飾的方法是否可以被重寫的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • struts2.5+框架使用通配符與動態(tài)方法常見問題小結

    struts2.5+框架使用通配符與動態(tài)方法常見問題小結

    這篇文章主要介紹了struts2.5+框架使用通配符與動態(tài)方法常見問題 ,在文中給大家提到了Struts2.5框架使用通配符指定方法 ,需要的朋友可以參考下
    2018-09-09
  • JavaSE詳細講解異常語法

    JavaSE詳細講解異常語法

    異常就是不正常,比如當我們身體出現(xiàn)了異常我們會根據(jù)身體情況選擇喝開水、吃藥、看病、等 異常處理方法。 java異常處理機制是我們java語言使用異常處理機制為程序提供了錯誤處理的能力,程序出現(xiàn)的錯誤,程序可以安全的退出,以保證程序正常的運行等
    2022-05-05
  • Java利用SpEL表達式實現(xiàn)權限校驗

    Java利用SpEL表達式實現(xiàn)權限校驗

    這篇文章主要為大家詳細介紹了Java如何利用SpEL表達式實現(xiàn)權限校驗功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • JavaWeb之Servlet注冊頁面的實現(xiàn)示例

    JavaWeb之Servlet注冊頁面的實現(xiàn)示例

    注冊頁面是很多網(wǎng)站都會是使用的到,本文主要介紹了JavaWeb之Servlet注冊頁面的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 詳解spring mvc中url-pattern的寫法

    詳解spring mvc中url-pattern的寫法

    這篇文章主要介紹了spring mvc中url-pattern的寫法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Java在排序數(shù)組中查找元素的第一個和最后一個位置的方法詳解

    Java在排序數(shù)組中查找元素的第一個和最后一個位置的方法詳解

    相信大家在操作Java的時候經(jīng)常會要在一個數(shù)組(無序)中查找元素的第一個和最后一個位置,下面這篇文章主要給大家介紹了關于Java在排序數(shù)組中查找元素的第一個和最后一個位置的相關資料,需要的朋友可以參考下
    2024-01-01
  • 使用opencsv文件讀寫CSV文件

    使用opencsv文件讀寫CSV文件

    這篇文章主要為大家詳細介紹了用opencsv文件讀寫CSV文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評論