2012-04-20 53 views
2

不可正对MSMQ或WCF的专家,我读到了一个关于它的公平位,听起来和看上去很不错。 我正在努力开发一些东西,最终但首先是一些理论,它需要坚固耐用。MSMQ,WCF和鲁棒性

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

将有2个WCF服务。一个用于传入消息,另一个用于传出消息(需要的消息,不那么一些内部处理/验证其放置在传出消息队列或也许发送电子邮件/文本消息/无论)

我与正确的配置理解,我们可以让系统具有事务性(不会丢失任何消息),并且只能发送一次,所以不会有重复消息的机会。

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

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

我会很感激的任何建议和细节在这里。 WCF/MSMQ有相当多的选择。

+0

您可以使用事务,而不是...即使不顺心的事,之前发生崩溃或没有发送或者所有的消息被发送。 – Milee 2012-04-20 10:55:27

回答

9

你的假设:

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

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

将会有2个WCF服务。一个用于传入消息和其他 用于输出消息

在最典型的结构中,目标队列是本地侦听服务。

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

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

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

本质上,它是安全的假设没有消息丢失的原因是因为从一台机器到另一消息的传输,其实需要在三个不同的交易场所。

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

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

这是,如果你需要为了在信息处理链被保存下来,除了罚款。如果你需要有序的处理,那么你不能有多个线程,而不需要实现重新排序器来重新申请订单。

我以为MSMQ可以单独承载,并有x服务器共享 队列?

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

我认为的原因是因为如果服务器停机怎么办? 那么如何将这些消息被发送/接收到MSMQ

如果队列是事务性则意味着对他们的消息被保存在磁盘上。如果服务器出现故障,那么当它恢复时,消息仍然存在。当服务器关闭时,显然不能参与消息交换。然而,消息仍然可以“送”到服务器 - 他们只是保持当地的发送者(在临时队列),直到目标服务器重新上线。

所以通过具有一个中央MSMQ服务器(和具有它的镜像/故障转移) 则会有的机制保障正常运行时间

使用消息队列是它是一个容错传输的整点,所以你不需要保证正常运行时间。如果你有100%的可用性,那么使用消息队列几乎没有什么理由。

如何将WCF通知是收到的消息吗?

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

如何将服务通知发送消息

如果ServiceA未能将消息发送到ServiceB然后ServiceB将永远不会被通知故障的故障。它也不应该。 ServiceA将处理传输失败,而不是ServiceB。在这种情况下,您的期望会在服务之间形成一种硬耦合,消息排队应该消除。

+0

谢谢!我很感激。我认为MSMQ可以独立托管,并有x服务器共享该队列?我的想法是因为如果服务器出现故障,该怎么办?那么这些消息将如何发送/接收到MSMQ中,以便服务读取和写入?如果托管在与WCF服务相同的服务器上,那么如果该服务器停机?它是如何可以读/写到队列中,以便由具有一个中央服务器MSMQ(和具有它的镜像/故障转移),那么会出现的正常运行时间的机制保障。 – 2012-04-20 13:03:04

+0

虽然我没有看到这个,但WCF将如何通知消息传入?或者是否需要创建一个Windows服务/控制台应用程序,以及时寻找队列,获取消息并调用WCF服务?它是如何工作的?如何通知服务发送消息失败或新消息何时到达MSMQ? – 2012-04-20 13:04:25

+0

请参阅我的更新 – 2012-04-20 14:31:30

0

MSMQ可以存储消息即使临时关闭该服务或重新启动计算机。
WCF的主要目标是从源到目的地的传输消息。运输无所谓。在你的情况下,MSMQ是WCF的传输方式,并不明显可以同时在线/可用客户端和服务。但是,当接收到消息时,尽管使用什么传输来发送消息,但您有责任正确处理它。