【问题标题】:How do I increase the performance of MSMQ Receive() without using multiple threads如何在不使用多个线程的情况下提高 MSMQ Receive() 的性能
【发布时间】:2014-01-09 00:51:21
【问题描述】:

我无法在我的应用程序(C# 应用程序)中使用并行线程,因为每个 msmq msg 都是 sql 语句的数据

C# 应用程序使用 msmq 中的消息,然后对其进行处理。

我使用 msg.Recoverable=true,以防止服务器断电时数据丢失。 目前,它是事务性消息。

msmq消息(sql语句)必须按顺序处理(FIFO)

使用多线程消费是不行的,因为无法控制哪个线程消费和执行哪个sql语句。

目前,对于 490 KB 的 msmq 消息,Receive() 的速度约为 0.016 -0.032 秒,这使得大约 30-50 Tx/秒,这是不可接受的。

目前MSMQ接收是整个应用的瓶颈

服务器在 Windows Server 2008 R2 上

并且应用程序正在从本地服务器 MSMQ 获取(接收()),而不是远程

【问题讨论】:

  • 邮政编码。您如何处理 SQL 语句?
  • 先Peek,然后执行sql语句,如果sql语句执行成功,我执行Receive()。目前,Peek() 需要 0 秒,执行的 sql 语句需要 0 秒,Receive() 需要 0.016-0.032 秒。很明显,对于sql语句,必须先FIFO,(对于更新语句)
  • 代码已经优化到最大,目前的问题是如何进一步提高MSMQ Receive()的性能

标签: msmq


【解决方案1】:

我不是专家,但我认为您可以尝试使用批处理 - http://msdn.microsoft.com/en-us/library/ms788973.aspx

【讨论】:

  • 我提供的链接是关于将 WCF 与 MSMQ 结合使用,但我认为直接 MSMQ API 也可以进行批处理。
  • 不明白如何对 C# 控制台应用程序使用批处理,除了更改代码之外,我还有其他方法可以提高其性能吗?
  • 当前使用非事务队列,并使用字符串扔到 msg.Body 而不是 Object,Receive() 提高到 100 Transactions/sec。如何进一步提高 Receive() 的性能?如何在我的 C# 控制台应用程序中更改这些属性 msdn.microsoft.com/en-us/library/windows/desktop/…
【解决方案2】:

本博客讨论创建多个“QueuePeekCompleted”事件处理程序。它对我有用。

http://code-ronin.blogspot.com/2008/09/msmq-transactional-message-processing.html

【讨论】:

    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多