天天看點

資料庫與對象存儲S3如何保持一緻性背景介紹實作細節如何解決S3的髒資料問題

目錄

  • 背景介紹
  • 實作細節
  • 如何解決S3的髒資料問題

背景介紹

工作上實作了一個需求:需要将檔案上傳到S3(對象存儲),并在資料庫儲存檔案上傳通路位址及其他相關資料。功能看似比較簡單,但是發現有一些問題值得考慮。

實作細節

檔案上傳有新增、更新、删除操作,需要與資料庫保持一緻。S3的檔案操作是沒有事務保證的,但是資料庫有事務,這就會存在很多問題。

資料庫與對象存儲S3如何保持一緻性背景介紹實作細節如何解決S3的髒資料問題

由于檔案上傳和資料庫新增都在一個事務中,如果S3上傳失敗,那麼整個事務都會復原,是以不存在資料庫的髒資料,但是可能存在上傳完檔案後可能伺服器同時當機了,也有可能上傳多個檔案,一個成功,一個失敗,也有可能儲存資料庫失敗了,是以,S3可能已經上傳成功了,由于S3沒有任何事務保證而資料庫有事務保證,是以就在S3上形成了髒資料。

同理,先儲存資料庫,再上傳檔案到S3中也是一樣的,也有可能存在S3上傳完成之後伺服器立馬當機的情況或以上類似其他情況,都可能導緻S3上存在髒資料。

總結一句話:資料庫可以通過事務保證沒有髒資料庫,但是S3存儲無法保證。

如何解決S3的髒資料問題

首先,S3一定要預留足夠的存儲空間,防止由于髒資料導緻無法正常上傳檔案,此外還要一個定時任務,定時對比資料庫中的記錄和S3的資料,如果S3中的記錄在資料庫中不存在,那麼需要在S3中删除該檔案,還需注意檔案上傳時間,防止因為剛上傳的檔案還沒有來得及儲存到資料庫中導緻被誤删,是以一般不要删除當天上傳的檔案。根本原因是S3和資料庫無法同僚在一個事務中,是以無法保證強一緻性,隻能保證最終一緻性。

總結:

  • 使用定時任務(對比資料庫與S3中的記錄)删除S3中的髒資料,避免删除當天上傳到S3上的檔案,防止誤删。
  • S3預留足夠空間