代码之家  ›  专栏  ›  技术社区  ›  Erwin Alva

WCF多进程处理/设计

  •  3
  • Erwin Alva  · 技术社区  · 10 年前

    我目前正处于优化一个基于WCF的服务的设计阶段。该服务为一组非线程安全的库提供包装API。API也需要相当长的时间才能完成(平均0.5秒)。在一次批处理运行中可能会发生数十万次调用。

    当前端点导致12-15%的CPU利用率(8核)令人失望,这可能是因为只有一个线程可以为调用提供服务。库不是线程安全的,唯一的解决方案似乎是创建多个进程,每个进程都公开一个端点。

    我们必须保持“原始”端点,以便客户端界面保持不变:

    Client Thread --> +---------+   +-----------------+ <--> Worker Process 1
    Client Thread --> | Service |-->| "Worker Process | <--> Worker Process 2
    Client Thread --> | API     |   | Manager"        | <--> Worker Process 3
    Client Thread --> +---------+   +-----------------+ <--> Worker Process 4
    

    以下是我目前的想法:

    1. 原始端点将调用转发给“工作进程管理器”
    2. 这个“管理器”将有一个线程池,依次调用每个工作进程。该呼叫是阻塞呼叫。
    3. 每个工作进程公开一个(几乎)彼此相同的端点。(可能通过命名管道)。
    4. 原始服务API将更改为每个调用实例上下文(现在是单个)。

    这可能是一种常见的情况,所以我想知道在这种情况下WCF的最佳实践是什么?如果不是(不太可能),考虑到我们的限制,实现最佳性能的最佳方式是什么?

    2 回复  |  直到 10 年前
        1
  •  0
  •   usr    10 年前

    当前端点导致12-15%的CPU利用率(8核)令人失望,这大概是因为只有一个线程可以为调用提供服务。

    请明确说明:WCF很容易使所有CPU饱和。此限制由您的代码强加。


    你的建议会奏效的。也就是说,你可以打开 Web花园模式 用于该IIS应用程序池。然后,IIS将派生多个进程并向它们分发请求。希望,这种请求分发甚至足以让它发挥作用。如果这还不够,可以考虑让IIS产生比CPU更多的工作进程。

    这可能是常见的情况

    我第一次听说或在Stack Overflow上看到它。非常罕见。基本上,您必须在这里解决错误设计的API。

        2
  •  0
  •   Erwin Alva    9 年前

    我继续进行设计,并能够实现100%的CPU利用率。代码需要从服务主机(而不是UI主机)运行才能获得好处。

    希望这对遇到同样情况的人有所帮助。