【发布时间】:2012-07-03 17:35:57
【问题描述】:
我在控制台中使用 netNamedPipeBinding 绑定自托管 WCF 服务。该服务只有一个空方法Send(DataTable bulk)
[ServiceContract]
public interface IWcfQueueService
{
[OperationContract]
void Send(DataTable bulk);
}
public class WcfQueueService : IWcfQueueService
{
public void Send(DataTable bulk)
{
// Here would be something like _bulks.Add(bulk);
// BUT, for now it is empty method and still it's slower than MSMQ
}
}
我的客户从 DB 获得 200K 输入并使用我们的 BoundedThreadPool 处理它(仅创建,比如说,20 个线程)。每个输入都用不同的线程处理。每个线程执行MyMethod 并在MyMethod 的末尾将结果添加到bulkManager。
public void MyMethod(string input)
{
var res = ProcessInput(input);
bulkManager.Add(res);
}
当bulkManager 累积 N 项 (=bulk) 时,它将批量传递给另一个线程,它所做的只是使用以下两种方法之一将该批量加入队列:
- 如果启用 wcf:
wcfQueueService.Send(bulk); - 如果启用了 MSMQ,则为:
new MessageQueue(@".\private$\q").Send(new Message {Body = bulk});
这两种方法都有效,但 MSMQ 的工作速度要快得多。使用 MSMQ 客户端可以在 20 秒内处理大约 80K 块,而使用 wcf 只能处理 20K-30K 块。 我不明白为什么会这样。我的 WCF 像 MSMQ 一样在不同的进程中运行。另外,我的 WCF 不存储任何东西,它有空方法。那么为什么 MSMQ 会赢得 WCF?
更新
正如leppie 建议的那样,我尝试了.NetRemoting。 NetRemoting 确实提高了速度。客户端处理了 60K。但是,
- 还是比 MSMQ 慢
- 当我阅读 .Net Remoting 已被 WCF 弃用时,根据this,WCF 应该比 .Net Remoting 更快,那么为什么我会发现我的 wcf 更慢?也许我的绑定有误?
【问题讨论】:
-
你可能会发现远程处理比 MSMQ 快很多(给定命名管道,我假设 IPC 在本地机器上)。
-
@leppie,.Net Remoting 确实提高了速度。客户端处理了 60K。但是,1 - 它仍然比 MSMQ 慢,2 - 当我读到 .Net Remoting 已被 WCF 弃用,根据msdn.microsoft.com/en-us/library/…,WCF 应该比 .Net Remoting 快,那么为什么我知道我的 wcf 更慢?
-
@theateist:你能把服务上的
InstanceContextMode改成Single和ConcurrencyMode改成Multiple吗?然后再做一次测试。也尝试调整节流设置(在服务行为中)。 -
@theateist:WCF 仅在非 IPC 方案中“替换”.NET 远程处理。 WCF 本质上是断开连接的,而远程处理“主要是连接的”。 .NET 远程处理永远不会消亡! :)
-
@leppie:来吧,伙计……你在说什么?它已经死了:)。
标签: .net wcf performance msmq