【问题标题】:Slow MSMQ within a WCF serviceWCF 服务中的慢速 MSMQ
【发布时间】:2010-11-28 18:00:51
【问题描述】:

这是一件很奇怪的事情。

我使用 WCF 创建了一个简单的基于 SOAP 的 Web 服务。当调用“SubmitTransaction”方法时,事务被传递到应用程序服务。但如果应用程序服务不可用,则会将其写入 MSMQ。

像这样:

public void SubmitTransaction(someTransaction)
{
  try
  {
     // pass transaction data to application
  }
  catch(SomeError)
  {
     // write to MSMQ
  }  
}

因此,当发生错误时,事务将写入队列。现在,当直接在我的 WCF 服务中使用 MSMQ API 时,一切都很好。每次调用都需要几毫秒。

例如:

...
catch(SomeError)
{
  // write to MSMQ
  var messageQueue = new MessageQueue(queuePath);
  try
  {
    messageQueue.Send(accountingTransaction, MessageQueueTransactionType.Single);
  }
  finally
  {
    messageQueue.Close();
  }  
}

但由于我还想在系统的其他一些点使用消息队列功能,所以我创建了一个新的程序集来处理消息队列的写入。

喜欢:

...
catch(SomeError)
{
  // write to MSMQ
  var messageQueueService = new MessageQueueService();
  messageQueueService.WriteToQueue(accountingTransaction);
}

现在使用此设置时,网络服务突然变得很慢。从上面提到的毫秒数来看,现在每个调用最多需要 4 秒。只是因为消息队列的东西被封装在一个新的程序集中。逻辑完全一样。任何人都知道问题可能是什么......?

谢谢!

【问题讨论】:

    标签: wcf performance msmq


    【解决方案1】:

    好的,现在我知道了。它与我的日志记录设置(log4net)有关。我得先检查一下。很抱歉耽误了你的时间..

    【讨论】:

      【解决方案2】:

      这里有两行新代码:

      var messageQueueService = new MessageQueueService();
      messageQueueService.WriteToQueue(accountingTransaction);
      

      您知道这两者中的哪一个导致了问题吗?也许添加一些日志记录、分析,或者在调试器中单步执行以查看哪个看起来很慢。

      【讨论】:

      • 我会试着测量时间。但是这两行只是我上面显示的消息队列内容的替代品。 var messageQueueService = new MessageQueueService() 只会创建一个新实例。 messageQueueService.WriteToQueue(accountingTransaction) 与第一个示例完全相同。如果我直接将这个方法的内容复制粘贴到服务中,一切又很快了。唯一的区别是,它在另一个程序集中...
      猜你喜欢
      • 2011-01-10
      • 2012-03-16
      • 2015-08-20
      • 1970-01-01
      • 2022-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多