Tôi đang sử dụng phiên bản 4.3.0 của thư viện Lưu trữ Windows Azure cho .NET. Trong lớp kho ATS của tôi, tôi có một vài đợt xóa các phương pháp mà trông như thế này:"Mã phản hồi không mong muốn cho hoạt động: 0" khi thực thi lô lưu trữ bảng Azure xóa
public async Task DeleteAsync(IEnumerable<T> entities)
{
await ExecuteAsBatch(entities, (batch, entity) => batch.Delete(entity));
}
private async Task ExecuteAsBatch(IEnumerable<T> entities, Action<TableBatchOperation, T> batchAction)
{
var byPartition = entities.GroupBy(x => x.PartitionKey).ToList();
await byPartition.ForEachParallel(async group =>
{
// A maximum of 100 actions are allowed per batch job
var segments = group.ToList().ToSegmentedList(100);
await segments.ForEachParallel(async segment =>
{
var batch = new TableBatchOperation();
foreach (var entity in segment)
{
batchAction(batch, entity);
}
await Table.ExecuteBatchAsync(batch);
}, 10);
}, 10);
}
Ở những nơi khác trong mã của tôi, rằng DeleteAsync()
phương pháp hoạt động chính xác. Tuy nhiên, ở một nơi đặc biệt, tôi nhận được thông báo lỗi này khi thực hiện đợt:
Unexpected Response Code for Operation: 0
Dưới đây là các trang web gọi:
private async Task MergeAtsOrganizationUserEvents(int organizationId, IEnumerable<CustomerUserEvent> fromEvents, CustomerUser to)
{
var toDelete = (await fromEvents.SelectParallel(async fromEvent =>
{
var pkey = AtsOrganizationUserEventByMinute.GetPartitionKey(organizationId, fromEvent.OccurredOn);
var rkey = AtsOrganizationUserEventByMinute.GetRowKey(fromEvent.OccurredOn, fromEvent.CustomerUserEventId);
return await Ats.OrganizationUserEventByMinute.FindByPartitionRowAsync(pkey, rkey);
})).Where(x => x != null).ToList();
var toInsert = toDelete
.Select(x => AtsOrganizationUserEventByMinute.FromBase(x.OrganizationId, x.OccurredOn, x.CookieId,
to.CustomerUserId, x))
.ToList();
try
{
await Ats.OrganizationUserEventByMinute.UpsertAsync(toInsert);
await Ats.OrganizationUserEventByMinute.DeleteAsync(toDelete);
}
catch (Exception ex)
{
_logger.Error("Unable to merge {0} AtsOrganizationEvents for org {1}, to customer user {2}: {3}",
toInsert.Count, organizationId, to.CustomerUserId, ex.CompleteMessage());
throw;
}
}
Phương pháp UpsertAsync()
trên thành công, nhưng DeleteAsync()
thất bại. Lưu ý rằng nó không xóa chính xác các thực thể tương tự mà FindByPartitionRowAsync()
được truy xuất từ bảng, vì vậy tôi không thể tưởng tượng nó có thể liên quan gì đến các thực thể không đúng định dạng hoặc bất kỳ thứ gì của ilk đó.
Dưới đây là một ví dụ về một trong những "toDelete" đối tượng (ở định dạng JSON):
{
"CookieId":null,
"CustomerUserId":185766,
"CustomerUserEventId":3568687,
"OrganizationId":4190,
"EventName":"event1",
"SessionId":null,
"OccurredOn":"2014-10-20T18:17:09.9971379Z",
"UrlId":null,
"Url":null,
"ReferrerUrlId":null,
"ReferrerUrl":null,
"IsSynthetic":false,
"IpAddress":null,
"PartitionKey":"4190.2014.10.20",
"RowKey":"18.17.3568687",
"Timestamp":"2014-10-20T18:17:11.237+00:00",
"ETag":"W/\\" datetime'2014-10-20T18%3A17%3A11.237Z'\\""
}
Azure lưu trữ các thông báo lỗi có tiếng và ngoạn mục vô ích, và Googling đã trở gì về hàng loạt delete thất bại với đặc biệt này lỗi.
Điều này không thành công khi sử dụng bộ nhớ phát triển cục bộ và trong sản xuất.
Mọi suy nghĩ?
Xin chào Ken, bạn có nhớ chia sẻ mã .ForEachParallel() và .ToSegmentedList() của bạn không, nó trông rất tiện dụng. Cám ơn. –
Chắc chắn. Xem https://gist.github.com/smithkl42/ca5b98e909952eddef1e3a076c0dd91d và https://gist.github.com/smithkl42/36ca70a63fe1a3bbf2d03a4d0bbe46c2. –