我有一個具有blob和隊列觸發器的Azure WebKob以將數據保存到Azure DocumentDb。如何正確地限制WebJobs對DocumentDb的訪問
不時我得到一個錯誤:
Microsoft.Azure.Documents.RequestRateTooLargeException: Message: {"Errors":["Request rate is large"]}
目前我掐死使用此代碼的請求。一個WebJob功能:
public async Task ParseCategoriesFromCsv(...)
{
double find = 2.23, add = 5.9, replace = 10.67;
double requestCharge = Math.Round(find + Math.Max(add, replace));
await categoryProvider.SaveCategories(requestCharge , categories);
}
類別供應商操作文檔數據庫客戶端:
public async Task<ResourceResponse<Document>[]> SaveCategories(double requestCharge, Category[] categories)
{
var requestDelay = TimeSpan.FromSeconds(60.0/(collectionOptions.RequestUnits/requestCharge));
var scheduler = new IntervalTaskScheduler(requestDelay, Scheduler.Default); // Rx
var client = new DocumentClient(endpoint, authorizationKey,
new ConnectionPolicy
{
ConnectionMode = documentDbOptions.ConnectionMode,
ConnectionProtocol = documentDbOptions.ConnectionProtocol
});
return await Task.WhenAll(documents.Select(async d =>
await scheduler.ScheduleTask(
() => client.PutDocumentToDb(collectionOptions.CollectionLink, d.SearchIndex, d))));
}
任務調度程序油門/措施/同步請求:
private readonly Subject<Action> _requests = new Subject<Action>();
private readonly IDisposable _observable;
public IntervalTaskScheduler(TimeSpan requestDelay, IScheduler scheduler)
{
_observable = _requests.Select(i => Observable.Empty<Action>()
.Delay(requestDelay)
.StartWith(i))
.Concat()
.ObserveOn(scheduler)
.Subscribe(action => action());
}
public Task<T> ScheduleTask<T>(Func<Task<T>> request)
{
var tcs = new TaskCompletionSource<T>();
_requests.OnNext(async() =>
{
try
{
T result = await request();
tcs.SetResult(result);
}
catch (Exception ex)
{
tcs.SetException(ex);
}
});
return tcs.Task;
}
所以它基本上是一個數常量來自ResourceResponse<Document>.RequestCharge
但是:
- 當我有1隊列觸發它可以正常工作,但當8隊列它會引發錯誤。
- 如果增加請求費用8次然後8個隊列工作正常,但只有1個工程慢8倍。
什麼節流/測量/同步機制可以在這裏很好地工作?
您的代碼非常複雜。你已經有了課程的片段,你將Rx與TPL混合在一起。我認爲有一點簡單的Rx代碼可以在幾行代碼中完成你所需要的。您能否讓我們知道您正在執行的核心操作以及班級簽名是什麼? – Enigmativity
@Enigmativity:我害怕過分複雜化我的問題。所以實際上它至少有4個不同的類,非常薄,並且由一個容器連接的接口覆蓋。 – abatishchev
你絕對是讓它變得複雜。採用正確的結構將有助於我們。 – Enigmativity