【问题标题】:Strange performance issue C# and RabbitMq奇怪的性能问题 C# 和 RabbitMq
【发布时间】:2014-02-15 19:04:50
【问题描述】:

背景:

我开发了几个用于导入数据的 WCF 服务。当接收到数据时,我的服务会在 EasyNetQ 服务总线上发布请求,连接到 RabbitMq 服务器。

消费者然后接受请求,将其序列化为 XML,并将其作为参数发送到存储过程以进行处理。存储过程依次执行表合并以插入或更新数据。

问题:

我的问题是我有时每秒可以确认相当多的消息,有时性能很差,这反过来又导致我的队列在 RabbitMq 中建立。

我的应用程序使用以下技术:

  • TopShelf 用于托管 Web 服务。
  • Windsor 依赖注入
  • 用于记录、处理异常和计时性能的拦截器。
  • EasyNetQ 作为消息总线。
  • RabbitMq 作为消息代理。

我尝试了以下方法:

  • 多次执行相同的消息,似乎 执行时间变化很大。执行存储时 SQL Server Management Studio 中的过程,执行时间为 所有的重复都差不多。
  • 将我的解决方案与本地 RabbitMq 服务器和本地 数据库。
  • 删除了用于事务处理的拦截器。
  • 从创建\打开新连接更改了我的数据库连接类 每次调用以重用现有连接(使用删除 sql 连接语句)。

有人知道是什么导致了我的问题吗?

提前谢谢。 马蒂亚斯

【问题讨论】:

  • 您绝对应该尽可能地记录日志,并将瓶颈缩小到管道中非常具体的位置。没有它,你只能猜测。由于管道跨越多个子系统和技术,瓶颈可能在任何地方。
  • 可以是任意数量的东西。我会遵循@WiktorZychla 的建议,并尝试通过日志记录来缩小瓶颈。您还可以尝试删除管道的特定部分。一个优秀的 DBA 应该能够查看 SQL Server 分析工具,并告诉您可能在哪里遇到性能不佳的问题。 EasyNetQ 消息调度程序在单线程上运行,因此您可能需要尝试异步订阅方法和异步数据库 IO。

标签: c# wcf rabbitmq castle-windsor


【解决方案1】:

假设缓慢来自兔子 - 检查磁盘的 I/O 以防您使您的消息保持持久性和持久性,以防您不涉及磁盘,检查内存水印,以防您的内存运行过高, rabbit 会将其消息刷新到磁盘,这将导致在此过程中显着变慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    相关资源
    最近更新 更多