如何解决是否可以使用多个线程进行附加 blob 还原?
使用的是哪个版本的 SDK?
v0.11.0
您使用的是哪个平台? (例如:Windows、Linux、Debian)
视窗
遇到了什么问题?
[方法]
- 在 goroutine 启动前获取租约
- 调用 AppendBlock(ctx,bytes.NewReader(rangeData),azblob.AppendBlobAccessConditions{},nil) 同时在 go 例程中。
- 我们正在使用 "azblob.AppendPositionAccessConditions{IfAppendPositionEqual: subRangeSize}}" AppendBlock 调用。
它在没有线程的情况下运行良好,但在使用 goroutine 时失败 ===== 响应错误(ServiceCode=AppendPositionConditionNotMet)===== 说明=不满足指定的追加位置条件。
FourMegaByteAsBytes := common.FourMegaByteAsBytes
var strLeaseID string = ""
var respAcquireLease *azblob.BlobAcquireLeaseResponse
subRangeSize := int64(0)
//Restore data to Append Blob
for currpos := int64(0); currpos < SourceBlobLength; {
subRangeSize = int64(math.Min(float64(SourceBlobLength-currpos),float64(FourMegaByteAsBytes)))
rangeData := make([]byte,subRangeSize)
if len(strLeaseID) == 0 {
//Acquire the Lease for Restore Blob
respAcquireLease,err = blobURL.AcquireLease(ctx,"",-1,azblob.ModifiedAccessConditions{})
if err != nil {
_,err = blobURL.AppendBlock(ctx,nil)
} else {
strLeaseID = respAcquireLease.LeaseID()
_,err1 := blobURL.AppendBlock(ctx,azblob.AppendBlobAccessConditions{
azblob.ModifiedAccessConditions{},azblob.LeaseAccessConditions{LeaseID: strLeaseID},azblob.AppendPositionAccessConditions{},},nil)
if err1 != nil {
log.Fatal(err1)
return
}
}
} else {
_,azblob.AppendBlobAccessConditions{
azblob.ModifiedAccessConditions{},azblob.AppendPositionAccessConditions{}},nil)
}
currpos += subRangeSize
}
您是否找到了缓解措施/解决方案? 否
解决方法
附加到 blob 需要您有租约。因此,只有拥有租约的客户端(又名线程)才能写入 blob。
所以您的问题的答案是否定的,不可能同时进行。
有两种可能的解决方法:
- 如果您的所有线程都写入队列。然后一个进程从队列中读取数据并写入 blob。
- 进行编程,使胎面等待租约可用。请注意,租用的最短持续时间为 15 秒。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。