我正在使用它来启动从DocumentDB集合中插入或删除文档的线程。
它有效,但我不确定我应该知道我可以旋转多少个线程。
有时候,它会在{7}处与maxThreads
一起使用,我会很快得到Request rate is large
错误。但有时候,即使是3个线程,我也会得到同样的错误。
所以这显然不是很科学。
我想我必须监控每次调用后我使用了多少个RU,并且可能会在几毫秒内调整逻辑。
有什么想法吗?
public class MultiThreadOperations<T> where T : IDocumentModel
{
List<T> Documents = new List<T>();
CollectionDB<T> Collection;
OperationType OperationType;
List<Task> AllTasks = new List<Task>();
public MultiThreadOperations(List<T> documents, CollectionDB<T> Collection, OperationType opType)
{
this.Collection = Collection;
Documents = documents;
OperationType = opType;
}
public async Task Start()
{
var maxThreads = 2;
using (SemaphoreSlim concurrencySemaphore = new SemaphoreSlim(maxThreads))
{
foreach (T doc in Documents)
{
concurrencySemaphore.Wait();
var t = Task.Run(async () =>
{
try
{
switch (OperationType)
{
case OperationType.Create:
await InsertDocument(doc);
break;
case OperationType.Delete:
await DeleteDocument(doc);
break;
}
}
finally
{
concurrencySemaphore.Release();
}
});
AllTasks.Add(t);
}
await Task.WhenAll(AllTasks.ToArray());
}
}
private async Task InsertDocument(T item)
{
await Collection.CreateAsync(item);
}
private async Task DeleteDocument(T item)
{
await Collection.DeleteFromId(item.Id);
}
}
答案 0 :(得分:0)
取决于以下因素:
例如,在同一个Azure区域内,如果您有10,000 RU / s,则说每个创建或删除需要5个RU,网络延迟为5毫秒。这意味着每个线程可以执行1000/5 = 200次写入/秒= 200 * 5 RU / s = 1000 RU / s。因此,您需要10个线程才能达到10,000 RU / s。
让我们说,您正在欧洲访问美国东部帐户的虚拟机上运行相同的测试。网络滞后是~100ms。这意味着每个线程可以执行~10个请求/秒= 50 RU / s。因此,您需要200个线程才能达到相同的10,000 RU / s。