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 弃用时,WCF 应该比 .Net Remoting 快,那么为什么我知道我的 wcf 更慢?也许我的绑定是错误的?