gpt4 book ai didi

wcf - MSMQ、WCF 和健壮性

转载 作者:行者123 更新时间:2023-12-02 06:39:54 26 4
gpt4 key购买 nike

我不是 MSMQ 或 WCF 方面的专家,但我已经阅读了一些相关内容,它听起来和看起来都很棒。我正在尝试开发一些东西,最终但首先是一些需要稳健和持久的理论。

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

将有 2 个 WCF 服务。一个用于传入消息,另一个用于传出消息(获取一条消息,进行一些内部处理/验证,然后将其放入传出消息队列或可能发送电子邮件/文本消息/其他)

我知道通过正确的配置,我们可以拥有这样的系统,它可以是事务性的(不会丢失任何消息)并且可以只发送一次,因此不会有重复消息的机会。

应用程序/服务将采用多线程处理消息,消息数量将达到成百上千。

但是在处理消息或整个服务生命周期期间,如果服务器崩溃怎么办?如果服务器重新启动怎么办?如果服务出于某种原因抛出异常怎么办?怎么可能不丢失该消息,而是如何将其放回队列中等待再次处理?另外,如何确保该服务能够再次产生自己的健壮性?

如有任何建议和详细信息,我将不胜感激。有很多东西可以接受,WCF/MSMQ 公开了很多选项。

最佳答案

你的假设:

MSMQ I guess will be hosted on a seperate server.

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

There will be 2 WCF services. One for incoming messages and the other for outgoing messages

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

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

I understand with the right configuration, we can have the system so that it can be transactional (no messages are ever lost)

这是正确的。这是因为 MSMQ 使用称为存储转发的消息传递模式。参见 here寻求解释。

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

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

The applications/services will be multithreaded to process messages

这很好,除非您需要在消息处理链中保留顺序。如果您需要有序处理,那么如果不实现重新排序器来重新应用订单,您就不能拥有多个线程。

I thought that MSMQ can be hosted seperately and have x servers share that queue?

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

The reason for my thinking was because what if the server goes down? Then how will the messages get sent/received into MSMQ

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

so by having one central MSMQ server (and having it mirrored/failover) then there will be guarentee of uptime

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

how will WCF be notified of messages that are incoming?

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

how will the service be notified of failures of sending messages

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

关于wcf - MSMQ、WCF 和健壮性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10244263/

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