【发布时间】:2014-09-08 13:18:19
【问题描述】:
这个问题是关于在 Web 服务 (ASMX) 中实现负载平衡的。不是 WCF。
我创建了 Web 服务 (ASMX) 并且我有一个 WebMethod:
[WebMethod(Description = "Extracting data from the image.")]
public PersonData GetInfo(byte[] image)
{
PersonData data = new PersonData();
IFlexiCaptureProcessor processor = fcWebServiceProcessorsPool.GetProcessor();
processor.AddImageFile(image);
IDocument document = processor.RecognizeNextDocument();
data.Number = document.Sections[0];
data.Date = document.Sections[1];
return data;
}
我的 fcWebServiceProcessorsPool 中有 5 个处理器 - 处理器数量取决于 CPU 内核的数量。 我需要创建另一个 WebMethod:
[WebMethod]
public List<PersonData> GetInfo(List<byte[]> images)
{
//foreach byte[] image in images
//...the same code
}
但我不知道如何实现并发处理。 我的期望:
- 1 个请求 = 100 个图像; 5 个处理器是空闲的 => 5 个加载的处理器 每张有 20 张图片。
- 瞬间 6 个请求 = 1 个图像、1 个图像、20 个图像、30 个图像、40 个 图片,50 张图片; 5 个处理器空闲 => 5 个加载的处理器,1 个请求 排队。
1 个任务是 1 个图像。 我的目标 - 始终平等地加载每个处理器。
我该怎么做?这是我的第一个 Web 服务,所以我对此一无所知。我发现了很多关于 ThrottlingBehavior 的文章,但它指的是 WCF,但我的程序不是 WCF。我需要一些建议。
我使用我公司提供的 .NET Framework 4.5 和 dll 来处理图像。
【问题讨论】:
-
在同一台计算机的 CPU 上进行负载平衡? ASP.NET 将在不同的线程上为每个请求提供服务(您可以在每个请求中并行工作),框架、操作系统和 CPU 本身将完成所有工作。 BTW 内核负载平衡并不是那么容易。例如,假设一个核心被提升而一个核心被关闭。唤醒那个沉睡的核心并减慢另一个核心或排队这样的请求是更好吗?如何管理缓存局部性? IMO 不会尝试管理这些细节,除非你真的清楚自己在做什么(而且 IMO ASP.NET 太高,无法清楚地了解它们)
-
顺便说一句,ASMX 不再受支持。你应该考虑切换到Web API。
-
这个问题与负载均衡无关。这是并发/并行处理,由 TPL、PLINQ 和 TPL DataFlow 处理。 Web 框架的类型在这里无关紧要。重要的问题是你想对图像进行什么样的处理?哪个 .NET 框架?
标签: c# .net parallel-processing task-parallel-library