0

アプリケーション固有のドキュメントをアップロードするためのAzureにはBlobストレージコンテナがあり、ファイルアップロードプロセス中に特定のファイルのメタデータが保存されるAzure Sql Dbがあります。このアップロードプロセスは、Sql Dbにメタデータのレコードがなく、その逆のファイルがストレージに存在しないように、一貫性が必要です。 フロントエンドから取得したファイルのリストを、マルチパートのHttpContentとしてアップロードしています。 Web Apiコントローラから、httpContent、ファイル名、およびファイルがアップロードされるフォルダパスを渡すアップロードサービスを呼び出します。 Web APIのコントローラ、サービスメソッド、リポジトリはすべてasynです。ここでAzure BlobストレージとAzure SQL Dbアトミックトランザクション

var files = await this.uploadService.UploadFiles(httpContent, fileNames, pathName); 

サービスメソッドです:

public async Task<List<FileUploadModel>> UploadFiles(HttpContent httpContent, List<string> fileNames, string folderPath) 
     { 
      var blobUploadProvider = this.Container.Resolve<UploadProvider>(
       new DependencyOverride<UploadProviderModel>(new UploadProviderModel(fileNames, folderPath))); 

      var list = await httpContent.ReadAsMultipartAsync(blobUploadProvider).ContinueWith(
       task => 
       { 
        if (task.IsFaulted || task.IsCanceled) 
        { 
         throw task.Exception; 
        } 

        var provider = task.Result; 
        return provider.Uploads.ToList(); 
       }); 

      return list; 
     } 

サービスメソッドがSystem.Net.Http.MultipartFileStreamProviderから導出され、カスタマイズアップロードプロバイダを使用して、我々が使用してこの問題を解決します依存関係リゾルバ。 その後、これらのファイルごとにmeta detaモデルを作成し、Entityフレームワークを使用してDbに保存します。理想的な状況では完全なプロセスが正常に機能します。

アップロードプロセスが成功した場合、問題があるが、何とかDB操作は失敗し、その後、我々は、BLOBストレージにアップロードされたファイルを持っていますが、SQL DBに対応するエントリがないため、データの矛盾があります。

  • AzureのアピのApp
  • Azureブロブストレージ
  • Web APIを
  • の.Net 4.6.1
  • :後

は、システムで使用される様々な技術ですエンティティフレームワーク6.1.3

  • AzureのMSSQLデータベース(私たちはすべてのVMを使用していない)
  • 私はどのように

    • (のみDBの作品)、ブロブとDbのために働いていないようで一貫性を保つためのTransactionScopeを使用して試してみました私たちはこの問題を解決しますか?

    • 内蔵またはサポートされている機能はありますか?

    • この場合のベストプラクティスは何ですか?

    答えて

    2

    このための任意で構築やサポートされる機能はありますか?

    現在のところ、基本的にBLOBサービスとSQLデータベースは2つの別々のサービスであるため、あなたが期待しているような "アトミックトランザクション"機能を実装することはできません。

    この問題をどのように解決しますか?

    私は、この問題を解決するには、2つの方法(私も他のがあるだろうと確信しています)を考えることができます:あなた自身のトランザクション機能を実装

    1. :基本的には、データベースのトランザクション障害をチェックし、その場合には手動でブロブを削除します。
    2. バックグラウンドプロセスを使用する:ここでは、データをブロブストレージに保存してから、バックグラウンドプロセスによって孤立したブロブを定期的に見つけ出し、それらのブロブを削除します。
    +0

    あなたの答えをありがとう、私はあなたが言ったように手動で行う必要がありますね。 –

    関連する問題