奇怪的性能问题C#和RabbitMq
背景: 我开发了两个用于导入数据的WCF服务。当接收数据时,我的服务在连接到RabbitMq服务器的EasyNetQ服务总线上发布请求 然后使用者接受请求,将其序列化为XML,并将其作为参数发送到存储过程进行处理。存储过程依次执行表合并以插入或更新数据 问题: 我的问题是,有时我每秒可以确认相当多的消息,有时性能非常差,这反过来导致我的队列在RabbitMq中累积 我的应用程序使用以下技术:奇怪的性能问题C#和RabbitMq,c#,wcf,rabbitmq,castle-windsor,C#,Wcf,Rabbitmq,Castle Windsor,背景: 我开发了两个用于导入数据的WCF服务。当接收数据时,我的服务在连接到RabbitMq服务器的EasyNetQ服务总线上发布请求 然后使用者接受请求,将其序列化为XML,并将其作为参数发送到存储过程进行处理。存储过程依次执行表合并以插入或更新数据 问题: 我的问题是,有时我每秒可以确认相当多的消息,有时性能非常差,这反过来导致我的队列在RabbitMq中累积 我的应用程序使用以下技术: 用于托管web服务的TopShelf 温莎依赖注入 用于记录、处理异常和计时性能的拦截器 EasyNe
- 用于托管web服务的TopShelf
- 温莎依赖注入
- 用于记录、处理异常和计时性能的拦截器
- EasyNetQ作为消息总线
- RabbitMq作为消息代理
- 多次执行相同的消息,似乎 执行时间变化很大。执行存储的 SQL Server Management Studio中的过程,执行时间为 所有重复都差不多
- 将我的解决方案连接到本地RabbitMq服务器和本地 数据库
- 删除了用于事务处理的拦截器
- 从创建\打开新连接更改了我的数据库连接类 对于重复使用现有连接的每次调用(使用 语句(用于sql连接)
Matias假设慢度来自rabbit-检查磁盘的I/O,以防消息持久化,如果不涉及磁盘,请检查内存水印,如果内存过高,rabbit会将其消息刷新到磁盘,在这个过程中,这将导致显著的缓慢。您应该尽可能地记录日志,并将瓶颈缩小到管道中的一个非常特定的位置。没有它,你只能猜测。由于管道跨越多个子系统和技术,瓶颈可能在任何地方,也可能是任何数量的东西。我会听从@WiktorZychla的建议,努力缩小日志记录的瓶颈。您还可以尝试删除管道的特定部分。一个好的DBA应该能够查看SQL Server分析工具,并告诉您性能低下的地方。EasyNetQ消息分派器在单个线程上运行,因此您可能希望尝试异步订阅方法和异步数据库IO。