高度并发地写入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