MSMQ,WCF和稳健性

Ahm*_*yas 2 wcf design-patterns msmq-wcf

我不是MSMQ或WCF的专家,我已经读了很多关于它的内容,听起来很棒.我正在努力开发一些东西,但最先是一些理论,它需要坚固耐用.

我想MSMQ将托管在一个单独的服务器上.

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

我理解正确的配置,我们可以让系统成为事务性的(没有消息丢失)并且可以发送一次,因此没有重复消息的可能性.

应用程序/服务将是多线程的,以处理消息,其中将有数百个消息.

但是在处理消息期间或通过服务生命周期,如果服务器崩溃了怎么办?如果服务器重新启动怎么办?如果服务因任何原因抛出异常怎么办?怎么可能不丢失该消息,但有些如何将它放回队列等待它再次处理?另外,如何才能确保服务的稳健性能让它再次产生自身?

我很感激这里有任何建议和细节.有很多东西可以接受,WCF/MSMQ暴露了很多选项.

tom*_*ern 9

你的假设:

我想MSMQ将托管在一个单独的服务器上.

是不正确的.MSMQ安装在所有想要参与消息队列的机器上.

将有2个WCF服务.一个用于传入消息,另一个用于传出消息

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

例如,您的ServiceA将具有从中读取的本地队列.ServiceB还有一个本地队列,可以从中读取.如果ServiceA想要呼叫ServiceB,它将向ServiceB的本地队列发送一条消息.

我理解正确的配置,我们可以让系统,以便它可以是事务性的(没有消息丢失)

这是对的.这是因为MSMQ使用称为存储转发的消息传递模式.请看这里的解释.

基本上,假设没有消息丢失是安全的原因是因为从一台机器到另一台机器的消息传输实际上是在三个不同的事务下发生的.

  1. 第一个事务:ServiceA写入它自己的临时本地队列.如果失败,则事务回滚,ServiceA可以处理异常.
  2. 第二个事务:ServiceA机器上的队列管理器将消息传输到ServiceB机器上的队列管理器.如果失败,则消息仍保留在临时队列中.
  3. 第三个事务:ServiceB从本地队列中读取消息.如果ServiceB消息处理程序方法抛出异常,则事务将消息回滚到本地队列.

应用程序/服务将是多线程的以处理消息

这很好,除非您需要在消息处理链中保留订单.如果您需要有序处理,那么在没有实现重新定序器来重新应用订单的情况下,您不能拥有多个线程.

我认为MSMQ可以单独托管并让x服务器共享该队列?

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

我的想法是因为如果服务器发生故障怎么办?那么如何将消息发送/接收到MSMQ中

如果队列是事务性的,那么这意味着它们上的消息将持久保存到磁盘.如果服务器出现故障,那么当它恢复时,消息仍然存在.当服务器停机时,显然无法参与消息交换.但是,消息仍然可以"发送"到该服务器 - 它们只是保留在发送方本地(在临时队列中),直到目标服务器重新联机.

因此,通过拥有一个中央MSMQ服务器(并使其具有镜像/故障转移),那么将保证正常运行时间

使用消息队列的全部意义在于它是一种容错传输,因此您无需保证正常运行时间.如果您有100%的可用性,那么没有理由使用消息队列.

如何通知WCF传入的消息?

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

如何通知服务发送消息失败

如果ServiceA无法向ServiceB发送消息,则ServiceB将永远不会收到该故障的通知.也不应该.ServiceA将处理传输失败,而不是ServiceB.在这种情况下,您的期望会在服务之间创建一个硬连接,消息排队应该删除.