c# - WCF 多进程处理/设计

标签 c# multithreading wcf multiprocessing

我目前正处于优化我们基于 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 的最佳实践是什么?如果不是(不太可能),在我们的限制条件下实现最佳性能的最佳方法是什么?

最佳答案

The current endpoint results in disappointing 12-15% CPU utilization (8-core) presumably because there is only one thread to service a call.

只需明确这一点:WCF 很容易使所有 CPU 饱和。此限制由您的代码强加。


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

This may be a common scenario

我第一次听说或在 Stack Overflow 上看到它。很稀少。基本上,您必须在此处解决设计错误的 API。

关于c# - WCF 多进程处理/设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25005201/

相关文章:

c# - Windows服务/WCF和线程,初学者问题

c# - 如何将我的一些代码更改为类?

c# - 简单的 getJSON 不起作用

c# - 最佳实践 : C# working with DB

c# - 使用 C# Cross Threading 设置标签值

asp.net-mvc - 在路由路径上公开属于 MVC 应用程序中的区域的 WCF 服务

c# - 在 DAL 或服务层记录错误

c# - WPF DataGrid 和多线程

c# - 是否有一个通用集合,我可以通过索引器通过字符串键和索引访问元素?

c++ - 等待多个互斥锁的条件变量