高度同时写入Azure Blob存储的最佳方法?

时间:2018-04-03 05:50:58

标签: azure concurrency azure-storage-blobs azure-functions

高度并发地写入Azure Blob存储的最佳方式是什么,例如在Azure云功能中? 我正在使用Append Blob,因为这应该是这样的。 写作顺序对我来说并不重要。

到目前为止,我尝试了以下内容:

  • 我在没有任何访问条件的情况下使用了API方法 BlobService.appendBlobFromText - >这似乎是在跳过写作。我跑了一个并发测试和ca.最终的blob中有40000个写入没有结束

  • 我尝试了 BlobService.appendBlobFromText with Access Condition etag - >这导致了大量失败的写入。但似乎这个解决方案在性能方面出现了问题,而且之后我有一个文件,其中包含许多重复写入。

  • 我想使用函数输出绑定,但由于有关如何格式化和命名输出blob的要求,这不是一个选项

编辑:

这是我目前用于编写CSV blob的代码。该功能由队列消息触发:

module.exports = function (context, myQueueItem) {
  context.log(
    'JavaScript queue trigger function processed work item',
    myQueueItem
  )

  let blobService = storage.createBlobService(config.targetBlobConnection)
  let messageDayString = csvTransformer.determineDayFromMessage(myQueueItem)
  let blobName = messageDayString + '.csv'
  let csvMessage
  async.waterfall(
    [
      function (callback) {
        blobService.createContainerIfNotExists(
          config.targetBlobContainer,
          { publicAccessLevel: 'blob' },
          err => {
            callback(err)
          }
        )
      },
      function (callback) {
        blobService.doesBlobExist(
          config.targetBlobContainer,
          blobName,
          null,
          (err, blobResult) => {
            context.log('got blobResult: ', blobResult)
            callback(err, blobResult)
          }
        )
      },
      function (blobResult, callback) {
        if (blobResult && blobResult.exists) {
          csvMessage = csvTransformer.transformMessageToCSV(myQueueItem, false)
          blobService.appendBlockFromText(
            config.targetBlobContainer,
            blobName,
            '\n' + csvMessage,
            {accessConditions:
              {EtagMatch: '*'
              }
            },
            (err, appendedBlobResult) => {
              context.log('appended to existing blob: ', appendedBlobResult)
              callback(err, appendedBlobResult)
            }
          )
        } else {
          csvMessage = csvTransformer.transformMessageToCSV(myQueueItem, true)
          blobService.createAppendBlobFromText(
            config.targetBlobContainer,
            blobName,
            csvMessage,
            {accessConditions:
              {EtagNonMatch: '*'
              }
            },
            (err, createdBlobResult) => {
              context.log('created new blob: ', createdBlobResult)
              callback(err, blobResult)
            }
          )
        }
      }
    ],
    function (err, result) {
      if (err) {
        context.log.error('Error happened!')
        context.log.error(err)
        context.done(err)
      } else {
        context.log('appended CSV message to blob')
        context.bindings.outputQueueItem = csvMessage
        context.done()
      }
    }
  )
}

以下是一条示例消息:

{
  "Currency": "GBP",
  "StorefrontId": "BB64522",
  "VendorID": "",
  "BackendId": "210be438-2e5f-428d-bd43-3066f1b7bc22",
  "TransactionDateTime": "1\/28\/2018 3:35:54 PM",
  "SubscriberType": "Standard",
  "TransactionType": "Sale",
  "PartitionKey": "WholesaleTransaction",
  "RowKey": "16626034"
}

我想使用我的库将每条消息转换为CSV,每个消息都附加到以事务日期命名的blob中。上面的消息将进入名为2018-28-01.csv的Blob

0 个答案:

没有答案