【问题标题】:WCF Multithreading With Scalability Considerations具有可伸缩性考虑的 WCF 多线程
【发布时间】:2015-12-02 21:08:36
【问题描述】:

在无状态的 WCF REST Web 服务上工作,并有一个包含 3 个独立任务的操作。每一个都可以独立运行。每个任务都包含对外部 API 的 Web 服务调用和后续本地数据库读取操作,耗时不到 0.25 秒。

首先想到的是我应该生成 3 个单独的线程,然后加入并返回结果。在这里使用线程池可能不是一个好主意,因为它最多限制为 250 个线程。

性能值得关注,但不能以牺牲可扩展性为代价。

我是否应该担心为每个 Web 服务调用启动和加入 3 个单独线程的开销?

【问题讨论】:

    标签: multithreading performance wcf scalability


    【解决方案1】:

    将对外部服务的调用包装到异步任务方法中,然后从您的 WCF 方法中调用。它将使用线程池,如果线程拉取用尽,它将很好地排队您的 Web 服务调用。

    【讨论】:

    • 但这会违背可扩展性要求。线程池限制为最多 250 个线程。
    • 线程池大小通常等于逻辑线程数乘以 25。要扩展服务,您需要不断增加服务可用的逻辑线程数。
    • 由于线程数限制,我认为 ThreadPool 不适合我的问题中的场景。我什至不会考虑为此使用 ThreadPool。直接使用线程,没有软限制,只要你的硬件可以支持。
    • 考虑一下,取决于 CPU(假设是十六进制核心)线程池限制将是 300-350 个线程。每个服务调用 3 个线程,您只能支持约 100 个并发调用,其余的将排队。同样,不可扩展。
    • 线程池中处于等待状态的线程返回到线程池,直到异步方法返回。
    【解决方案2】:

    您可以使用异步 IO 来执行 Web 服务调用。异步 IO 在运行时根本不占用任何线程。您可以对数据库调用执行相同的操作。这可以缓解您可能遇到的任何线程问题。

    或者,您可以依赖线程池。您可以增加限制。您可以计算出您需要多少线程:如果每秒有 100 个请求到达并且每个请求需要 2 秒才能完成,那么您需要 200 个线程。假设您配置了适当的限制,这可以很容易地由内置线程池提供服务。

    如果外部服务关闭并需要 30 秒超时,这个数字现在会发射多达 3000 个线程,我认为这是不安全的。因此,您要么需要低超时、断路器或异步 IO。

    因此,为了决定您需要预测负载和延迟。

    我将链接到一些关于为什么以及何时使用异步 IO 的讨论:

    https://stackoverflow.com/a/25087273/122718 为什么 EF 6 教程使用异步调用? https://stackoverflow.com/a/12796711/122718我们应该切换到默认使用异步 I/O 吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多