我的团队有一个windows服务,它使用http绑定承载wcf服务。当wcf服务接收到消息时,它会立即将其发送到另一个wcf服务,使用NetMsmqBinding,该服务也托管在windows服务中。msmq服务处理该消息并保存它以执行我们的DB。
在开发和分期环境中,一切都很好。但是,当我们部署到生产中时,我们看到发送到服务的消息被乘以n+1因子(对于n条消息)。
例如:收到1条消息,将2条保存到DB。收到4条消息,20条保存到DB等。
我们怀疑它与事务的msmq服务设置有关,
并发性和InstanceContextMode,但是我们无法解决它。
该服务的设置如下:
我们使用.Net 4,MSMQ3.0和Windows 2003。
对什么会导致这个问题有什么想法吗?
编辑:
经过大量的研究,我们发现了以下几点:
我们真的很无知..。
谢谢
发布于 2013-03-04 18:05:10
嗯,我们终于得到了它:我们使用Entlib进行日志记录,并添加了一个DB侦听器。Entlib DB侦听器使用服务的相同事务。当它试图将事务传递给DB服务器时,会引发一个错误,因为MSDTC没有在DB服务器上正确配置,从而导致事务回滚。当WCF运行时尝试提交事务时,它会失败,因为它已经被中止,然后再次尝试处理相同的消息(因为内置的重试机制)。
当我们修复MSDTC设置时,复制停止。
现在,我们需要弄清楚的是:为什么回滚到服务事务会导致消息成倍增加?
发布于 2013-03-04 14:51:08
除非应用程序删除消息或TimeToBeReceived计时器过期,否则MSMQ不会删除消息。
如果我正确地理解了您的环境,您的问题可能是由于接收到的消息处理时间过长造成的。如果消息的接收和重新发送是在同一个事务中完成的,那么第一个WCF服务可能会在最后从队列中删除消息之前多次尝试读取相同的消息。
这使我想到以下你可以尝试的想法:
InstanceContextMode.Single , ConcurrencyMode = ConcurrencyMode.Single (https://stackoverflow.com/a/2610093/219344)。https://stackoverflow.com/questions/15074568
复制相似问题