【发布时间】: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