5

yクエリは次のようなものです

this.ProcessRequestSync(() => this.Client.CreateDocumentQuery<Model>(this.DocumentDBCollectionLink).Where(d => d.name.Equals(name) && d.code.Equals(code) && d.Type.Equals(this.documentType) && d.CreatedBy.Equals(myName).ToList<Model>());

 public dynamic ProcessRequestSync(Func<dynamic> getRequest)
{
    var delay = TimeSpan.Zero;
    var minDelayTime = new TimeSpan(0, 0, 1);
    for (;;)
    {
        try
        {
            Thread.Sleep(delay);
            return getRequest();
        }
        catch (DocumentClientException documentClientException)
        {
            var statusCode = (int)documentClientException.StatusCode;
            if (statusCode == 429 || statusCode == 503)
            {
                string errorMessage = string.Format("failed at DocumentDB with {0} status and {1} retry time", statusCode, documentClientException.RetryAfter);
                this.Logger.Log(errorMessage );

                // Back off if the request rate is too large or the service is temporarily unavailable
                delay = TimeSpan.Compare(documentClientException.RetryAfter, minDelayTime) >= 0 ? documentClientException.RetryAfter: minDelayTime;
            }
            else
            {
                throw;
            }
        }
    }
}

requestRateTooLarge 例外発生時のリトライロジックのメソッドです。

うまくいっているかどうかはわかりませんが、

Exception: Microsoft.Azure.Documents.RequestRateTooLargeException を取得していますが、一度に約 4000 レコードのクエリと挿入を行っています。

挿入には同じ再試行ロジックを使用しましたが、正常に機能しています。エラーは発生せず、すべてのレコードを正常に挿入しましたが、クエリ データを取得できません。

4

2 に答える 2

5

また、AggregateException の catch ブロックが必要であり、AggregateException.InnerException が DocumentClientException であるかどうかを確認し、StatusCode == 429 に対して同じチェックを実行します。クエリの実行は非同期であるため、AggregateException 内にラップされたスロットル例外を取得している可能性があります。

完全な再現を投稿していただければ、問題を明確に特定できる可能性があります。

于 2015-03-26T15:19:25.820 に答える
5

上記/以下の@aravind Ramachandraと@Ryan CrawCourの回答に基づいて、これは私が問題を回避するために使用しているものです。

    public async Task SaveToDocDb(dynamic jsonDocToSave)
    {

        using (var client = new DocumentClient(endpoint, authKey))
        {
            var queryDone = false;
            while (!queryDone)
            {
                try
                {
                    await client.CreateDocumentAsync(docCollectionlink, jsonDocToSave);
                    queryDone = true; 
                }
                catch (DocumentClientException documentClientException)
                {
                    var statusCode = (int)documentClientException.StatusCode;
                    if (statusCode == 429 || statusCode == 503)   
                        Thread.Sleep(documentClientException.RetryAfter);
                    else
                        throw;
                }
                catch (AggregateException aggregateException)
                {
                    if(aggregateException.InnerException.GetType() == typeof(DocumentClientException)){

                        var docExcep = aggregateException.InnerException as DocumentClientException;
                        var statusCode = (int)docExcep.StatusCode;
                        if (statusCode == 429 || statusCode == 503)
                            Thread.Sleep(docExcep.RetryAfter);
                        else
                            throw;
                    }
                     else 
                       throw;
                }
            }
        }
    }
于 2015-04-11T14:00:18.810 に答える