【问题标题】:Parallel Foreach webservice call并行 Foreach 网络服务调用
【发布时间】:2013-11-25 12:01:35
【问题描述】:

我们已经实现了需要处理传入批次的应用程序。例如,必须将一组特定对象类型的请求发送到特定的 Web 服务以对其进行处理

我们已经实现了以下 sn-p 来做到这一点。如果有任何陷阱,需要您的帮助/指导

var options = new ParallelOptions { MaxDegreeOfParallelism = 10 };

Parallel.ForEach(request, options, currentRequest =>
{
    ProcessedRequest processedRequest = null;
    try
    {
        currentRequest.DBSave = true;

        processedRequest = CommunicateToService(currentRequest);

    }
    catch (Exception ex)
    {

        ExceptionManager.HandleException(ex);
    }
});

在 CommunicateToservice 方法中,我们将调用服务并传递请求并获取响应对象并将大约 10 -15 个表保存到 MS SQL DB。整个方法被 AggregateException 包裹着。

需要有关如何确定 MaxDegreeOfParallelism 值的意见。

【问题讨论】:

  • 如果这确实是在处理一批类似的项目,您可能希望将该批次传递给服务一次,并让服务处理多线程。甚至可能对 sql 使用批处理,因此它在一个进程中,但仍然比线程快。线程,特别是如果每​​个线程都在做繁重的工作,并不一定比良好的批处理快。
  • Communicatetoservice 方法调用外部服务进行响应,并在到达时将其保存到数据库。我的意思是方法处理多线程
  • 也许批量发送所有请求,处理它们并将它们一批保存到数据库中会更快。大多数数据库都有非常高效的批处理 API,而且您没有多次服务调用的开销。但只有你自己知道这样会不会更快。

标签: c# task-parallel-library plinq


【解决方案1】:

对于 IO 密集型工作,没有简单的指导方针。您不知道最佳吞吐量的点是什么。测试不同的值并测量哪个值最快。

您可能不应该将 DOP 设置得太高,因为这可能会使远程服务过载。

【讨论】:

  • 重载远程服务是我们的应用程序中发生的事情。我们如何防止这种情况发生?我们正在寻找一种在扩大同时通话时更加保守的方法,并且在通话超时时缩小。对此有何建议?
  • @spike 您可能应该将此作为一个新问题提出。听起来很棒!
猜你喜欢
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 2011-10-14
  • 2010-12-30
相关资源
最近更新 更多