这个问题是关于在Web Service(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个任务是1个图像。 我的目标 - 始终同样加载每个处理器。
我该怎么做?这是我的第一个Web服务,所以我对它一无所知。我发现了很多关于ThrottlingBehavior的文章,但它引用了WCF,但我的程序不是WCF。我需要一些建议。
我使用我公司提供的.NET Framework 4.5和dll来处理图像。
答案 0 :(得分:2)
为了平衡CPU /核心,您需要考虑什么?很多东西,例如:
一般来说,从我的角度来看,这些细节实际上处于非常低的水平,而在ASP.NET中,您无法清楚地了解系统中发生的情况。即使您进行了认真的研究并且测量结果,您可能获得的是针对单个特定场景(以及单个特定CPU /系统架构)的有效内容。调整这些东西是件很难的事情,你需要详细信息(从运行时)和测试(从收集统计数据的大群体)。此外,即使您了解对于您的场景更好,您也无法控制所有这些事情(例如,您无法以编程方式唤醒核心)。
ASP.NET将在不同的线程中处理请求,您可以做的是并行执行计算。 .NET框架,底层操作系统以及最终CPU本身有更多细节可用于选择最佳方法,并且每个方案都将协同工作。
您正在使用C#编写ASP.NET,依靠经过严格测试和调整的组件会更容易(也更安全)。
在代码中(假设现代.NET即使.ASMX听起来很旧,如果你在.NET 2上运行,你只需要切换到直接在Parallel.ForEach
上排队的手工ThreadPool
实现)。请注意,这只是一个示例,用于描述我的意思,而不是您应该在生产中使用的代码:
[WebMethod]
public List<PersonData> GetInfo(List<byte[]> images)
{
var result = new ConcurrentBag<PersonData>();
Parallel.ForEach(images, image => {
result.Add(GetInfo(image));
});
return result.ToList();
}
给出答案:不关心这些细节。使用可以使用的最高工具(库,语言和框架)编写并行,可伸缩和并发代码,并让底层知道平衡。