在Web服务(ASMX)中实现并发处理,控制服务性能
本文关键字:服务 并发处理 控制 服务性 性能 实现 Web ASMX | 更新日期: 2023-09-27 18:21:14
这个问题是关于在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;
}
我的fcWebServiceProcessorPool中有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/内核之间实现平衡?很多东西,例如:
- Turbo Boost(或同等技术)。如果你有两个运行在3 GHz的核心和两个睡眠的核心,还有什么更好的?唤醒另一个核心(将前两个核心减慢到2 GHz)或将任务排入这两个核心
- 什么对缓存位置更好?由于缓存(代码和/或数据)的原因,在同一核心中对类似任务进行排队是否更有效
- 你担心耗电吗
- 所有核心负载相等?我指的不仅仅是你的程序,而是系统和后台服务/流程
- 您是否考虑了基本的ASP.NET基础结构?你知道它在哪儿跑吗?此外,不同的.NET/AASP.NET版本的行为也不同,其他版本的技巧可能无法很好地配合使用
总的来说,从我的角度来看,这些细节实际上处于非常低的水平,在ASP.NET中,您无法清楚地了解系统中发生了什么。即使你做了一项认真的研究并测量了结果,你可能会得到的结果对一个特定的场景(以及单个特定的CPU/系统架构)是有效的。调整这些东西是一件困难的事情,您需要详细信息(来自运行时)和测试(来自收集统计数据的大量人群)。此外,即使您了解什么对您的场景更好,您也无法控制所有这些事情(例如,您无法通过编程唤醒核心)。
ASP.NET将在不同的线程中提供请求,您可以做的是并行计算.NET框架、底层操作系统,最后是CPU本身有更多的细节可以用来选择最佳方法,每一个都将协同工作。
如果您在C#中为ASP.NET编程,那么依赖这些经过大量测试和调优的组件会更容易(也更安全)。
在代码中(假设.NET是现代的,即使.ASMX听起来很旧,如果您在.NET2上运行,您只需切换到直接在ThreadPool
上排队的手工Parallel.ForEach
实现)。请注意,这只是一个例子来概括我的意思,而不是你应该在生产中真正使用的代码:
[WebMethod]
public List<PersonData> GetInfo(List<byte[]> images)
{
var result = new ConcurrentBag<PersonData>();
Parallel.ForEach(images, image => {
result.Add(GetInfo(image));
});
return result.ToList();
}
要给出答案:不要在意这些细节。使用您可以使用的最高工具(库、语言和框架)编写并行、可扩展和并发代码,并让底层意识到平衡。