在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来处理图像。

在Web服务(ASMX)中实现并发处理,控制服务性能

您必须考虑哪些因素才能在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();
}

要给出答案:不要在意这些细节。使用您可以使用的最高工具(库、语言和框架)编写并行、可扩展和并发代码,并让底层意识到平衡。