2015-02-19 37 views
5

tôi cố gắng enqueue tin nhắn trong Azure Queues không đồng bộ như thế này:không đồng bộ gửi bài đến Azure Queues

private async Task EnqueueItemsAsync(IEnumerable<string> messages) { 
      var tasks = messages.Select(msg => _queue.AddMessageAsync(new CloudQueueMessage(msg), 
       null, null, null, null)); 

      await Task.WhenAll(tasks); 
     } 

Nếu tôi làm cho nó đúng này nói "bắt đầu enqueuing một mục sau khi khác mà không cần chờ họ được đăng, giữ một tham chiếu cho mỗi tác vụ và sau đó đợi cho đến khi tất cả được đăng ".

Mã này hoạt động tốt trong hầu hết các trường hợp, nhưng đối với một số lượng lớn mục (5000), nó bắt đầu enqueuing và sau đó ném ngoại lệ hết thời gian (sau khi đã nạp ~ 3500 mục).

tôi giải quyết nó bằng cách chờ đợi mỗi người để kết thúc trước khi tiếp tục tiếp theo một

private async Task EnqueueItemsAsync(IEnumerable<string> messages) { 
      foreach (var message in messages) { 
       await _queue.AddMessageAsync(new CloudQueueMessage(message), null, null, null, null); 
      } 
     } 

bất cứ ai có thể giải thích tại sao điều này xảy ra?

Ngoại lệ:

System.AggregateException bao bọc nhiều trường hợp ngoại lệ như: Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.<>c__DisplayClass4.<CreateCallbackVoid>b__3(IAsyncResult ar) Yêu cầu Thông tin RequestID: RequestDate: StatusMessage: < --- ---> (Inner Exception # 1) Microsoft.WindowsAzure.Storage. Lưu trữException: Khách hàng không thể hoàn thành hoạt động trong thời gian chờ được chỉ định. ---> System.TimeoutException: Máy khách không thể hoàn tất thao tác trong thời gian chờ được chỉ định. --- Kết thúc dấu vết ngăn xếp ngoại lệ bên trong --- Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndExecuteAsync [T] (IAsyncResult kết quả) `.

+0

Những dòng ném ngoại lệ? và phương pháp nào? Đăng tên, thông báo và stacktrace ngoại lệ –

+0

@SriramSakthivel cảm ơn vì đã đề cập đến, chỉ cần cập nhật bài đăng của tôi –

Trả lời

6

Hàng đợi trong Azure được thiết kế có thông lượng 2000 thư mỗi giây.

Xem: Azure Storage Scalability and Performance Targets

Khi ứng dụng của bạn đạt đến giới hạn về những gì một phân vùng có thể xử lý cho khối lượng công việc của bạn, Azure lưu trữ sẽ bắt đầu quay trở lại mã lỗi 503 (Server Busy) hoặc mã lỗi 500 (Thời gian chờ hoạt động) phản hồi. Khi điều này xảy ra, ứng dụng sẽ sử dụng chính sách trả về theo hàm mũ để thử lại. Việc trả về theo hàm mũ cho phép tải trên phân vùng giảm, và để giảm bớt lưu lượng truy cập vào phân vùng đó.

+0

Cảm ơn, tôi đoán điều này giải quyết được câu đố. Vì vậy, mã đầu tiên của tôi chạy vòng lặp trong chưa đến một giây, bắt đầu 5000 yêu cầu đăng trong chưa đầy một giây, kết quả là phản hồi hết thời gian chờ ... có vẻ hợp lý –

1

Dường như bạn có thể tạo cơ chế mạnh mẽ hơn bằng cách chuyển một số QueryRequestOptions đến AddMessageAsync.

Trước khi truy vấn được gửi, thông báo yêu cầu sẽ thêm các thuộc tính này vào lệnh.

Tôi sẽ thử chuyển QueryRequestOptions và đặt giá trị thành MaximumExecutionTimeServerTimeout với giá trị lớn hơn.

Đây là cách yêu cầu được điền trước khi được gửi:

// Microsoft.WindowsAzure.Storage.Queue.QueueRequestOptions 
internal void ApplyToStorageCommand<T>(RESTCommand<T> cmd) 
{ 
    if (this.LocationMode.HasValue) 
    { 
     cmd.LocationMode = this.LocationMode.Value; 
    } 
    if (this.ServerTimeout.HasValue) 
    { 
     cmd.ServerTimeoutInSeconds = new int?((int)this.ServerTimeout.Value.TotalSeconds); 
    } 
    if (this.OperationExpiryTime.HasValue) 
    { 
     cmd.OperationExpiryTime = this.OperationExpiryTime; 
     return; 
    } 
    if (this.MaximumExecutionTime.HasValue) 
    { 
     cmd.OperationExpiryTime = new DateTime?(DateTime.Now + this.MaximumExecutionTime.Value); 
    } 
} 

Và đây là cách nó được gửi:

rESTCommand.PreProcessResponse = delegate(RESTCommand<NullType> cmd, HttpWebResponse resp, Exception ex, OperationContext ctx) 
{ 
    HttpResponseParsers.ProcessExpectedStatusCodeNoException<NullType>(HttpStatusCode.Created, resp, NullType.Value, cmd, ex); 
    return NullType.Value; 
}; 
+0

Cảm ơn, cách tiếp cận thú vị để giảm thiểu cơ hội hết thời gian chờ, tuy nhiên tôi muốn hiểu những gì gây ra thời gian chờ ở nơi đầu tiên. –

Các vấn đề liên quan