gpt4 book ai didi

.net - NetMsmq绑定(bind) : messages are being processed multiple times

转载 作者:行者123 更新时间:2023-12-02 05:13:02 25 4
gpt4 key购买 nike

我的团队有一个 Windows 服务,它使用 http 绑定(bind)托管一个 wcf 服务。当 wcf 服务收到一条消息时,它会立即使用 NetMsmqBinding 将其发送到另一个 wcf 服务,该服务也托管在 Windows 服务中。 msmq 服务处理消息并将其保存到我们的数据库中。

在开发和暂存环境中,一切正常。但是,当我们部署到生产环境时,我们看到发送到我们服务的消息正乘以 n+1 倍(对于 n 条消息)。

例如:收到 1 条消息,2 条保存到数据库。收到 4 条消息,20 条保存到数据库等。

我们怀疑与Transactions的msmq服务设置有关,

Concurrency,还有InstanceContextMode,但是我们想不通。

服务的设置是:

  • InstanceContextMode:默认。
  • 并发模式:默认
  • 交易:TransactionScoreRequired = True 和 TransactionAutoComplete = True。
  • 重试次数 = 1,重试次数 = 1

我们使用 .Net 4、MSMQ 3.0 和 Windows server 2003。

对可能导致此问题的原因有任何想法吗?

编辑:

经过大量研究,我们发现了以下内容:

  • 当 wcf 运行时尝试为单个消息提交事务时,它会抛出“事务被异步中止”的异常。每次重复消息时都会抛出此异常。
  • 在 wcf 跟踪中,我们没有看到除上述异常之外的任何异常。
  • 在 System.Transaction 跟踪中,我们看到正在打开一个事务(对于第一条消息),然后在 wcf 运行时创建该事务的克隆(具有属性 RollbackIfNotCompleted=true)之后,几秒钟过去了,没有跟踪中没有消息,然后同样的事情再次发生。

我们真的是一无所知...

谢谢

最佳答案

MSMQ 不会删除消息,除非您的应用程序删除它或 TimeToBeReceived 计时器到期。

如果我对您的环境的理解正确,您的问题可能是由于接收消息的处理时间过长造成的。如果消息的接收和重新发送是在同一事务中完成的,则第一个 WCF 服务可能会在最终从队列中删除之前尝试多次读取同一消息。

这让我想到了以下您可以尝试的想法:

  • 您可能会在收到原始消息后尝试创建一条内容相同的新消息,并将新消息发送到下一个 WCF 服务。这应该会缩短接收消息的生命周期。

  • 如果您需要保留相同的消息顺序,您可以尝试 Miker169 的建议,将您的配置更改为 InstanceContextMode.Single , ConcurrencyMode = ConcurrencyMode.Single ( https://stackoverflow.com/a/2610093/219344 )

关于.net - NetMsmq绑定(bind) : messages are being processed multiple times,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15074568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com