作为不是MSMQ或WCF的专家,我已经阅读了一些有关它的内容,听起来不错。
我试图开发一些东西,最终但首先是一些理论,该理论必须坚固耐用。

我想MSMQ将托管在单独的服务器上。

将有2个WCF服务。一个用于传入消息,另一个用于传出消息(接收一条消息,进行一些内部处理/验证,然后将其放置在传出消息队列中,或者发送电子邮件/文本消息/任何内容)

我了解通过正确的配置,我们可以拥有系统,使其可以进行事务处理(不会丢失任何消息),并且可以发送一次,因此不会出现消息重复的机会。

应用程序/服务将是多线程处理消息,其中将有成千上万的消息。

但是在消息处理过程中或在服务生命周期中,如果服务器崩溃怎么办?如果服务器重新启动怎么办?如果服务由于任何原因引发异常怎么办?如何不丢失该消息,而是如何将其放回队列以等待再次处理?
另外,如何确保该服务的健壮性使其能够再次产生自身?

我会在这里感谢任何建议和细节。有很多需要考虑的地方,WCF / MSMQ提供了很多选择。

最佳答案

您的假设:



是不正确的。 MSMQ已安装在所有要参与消息排队的机器上。



在最典型的配置中,目标队列在侦听服务本地。

例如,您的ServiceA会有一个本地队列,可从中读取。 ServiceB还具有从中读取的本地队列。如果ServiceA想要调用ServiceB,它将在ServiceB的本地队列中放入一条消息。



这是对的。这是因为MSMQ使用称为存储转发的消息传递模式。有关说明,请参见here

本质上可以安全地假设没有消息丢失的原因是,由于消息从一台机器到另一台机器的传输实际上是在三个不同的事务下进行的。

  • 第一个事务:ServiceA写入它自己的临时本地队列。如果失败,事务将回滚,并且ServiceA可以处理该异常。
  • 第二个事务:ServiceA计算机上的队列管理器将消息传输到ServiceB计算机上的队列管理器。如果失败,则消息将保留在临时队列中。
  • 第三个事务:ServiceB从本地队列中读取消息。如果ServiceB消息处理程序方法引发异常,则事务会将消息回滚到本地队列。



  • 很好,除非您需要在消息处理链中保留订单。如果需要排序处理,那么如果不实现重新排序器以重新应用排序,则无法有多个线程。



    所有要参与消息交换的服务器都已安装MSMQ。然后,每个服务器都可以写入任何其他服务器上的任何队列。



    如果队列是事务性队列,则意味着队列中的消息将保留在磁盘上。如果服务器出现故障,则当服务器重新启动时,消息仍然存在。当服务器关闭时,它显然不能参与消息交换。但是,消息仍可以“发送”到该服务器-它们仅在发件人本地(处于临时队列中),直到目标服务器重新联机为止。



    使用消息队列的全部目的是它是一种容错传输,因此您不必保证正常运行时间。如果您具有100%的可用性,则没有理由使用消息队列。



    每个服务将侦听其自己的本地队列。消息到达时,WCF运行时将导致调用处理方法并处理消息。



    如果ServiceA无法将消息发送到ServiceB,则永远不会收到该失败的通知。也不应该。 ServiceA将处理传输失败,而不是ServiceB。在这种情况下,您的期望会在服务之间建立硬耦合,而消息队列应该将其删除。

    09-26 06:24