4

我需要构建像 Microsoft 的http://login.live.com这样的身份服务器。

为了处理故障转移,我将拥有多个 Web 服务器节点。计划是通过向数据库服务器发送消息来完成所有数据库写入操作。数据库将被镜像或复制。这个想法是数据库订阅写操作,但其他节点也订阅。这样其他节点就不需要从数据库中读取数据并且可以更新它们的缓存。

我刚刚开始学习服务总线架构,我不清楚如何处理服务总线的故障转移场景。

问题:

  1. 如果数据库服务器不可用,发布的消息会怎样?
  2. 它们会被存储在某个地方吗?
  3. 我是否需要额外的机器或集群来处理服务总线的故障转移?
  4. 我读到 SQL Server 可以用作消息存储,但我可以使用持久的 MSMQ 吗?我正在排队消息以便能够将它们写入数据库,那么为什么我要先将它们存储到数据库中,然后再将它们写入数据库?或者,我弄错了,DB 仅用于订阅列表而不用于消息?
4

2 回答 2

9

在实现这种架构时,您应该考虑应用 CQRS 的原则——查询(此用户/密码组合是否有效)不应通过总线完成;命令(更改密码、忘记密码)通过总线发送,而不是作为事件发布。虽然在内部您可能会使用事件来保持命令和查询端同步,但这不涉及客户端。

可以使用简单的 ado.net 对数据库的复制读取从属设备进行查询 - 这就是 CQRS 中的持久视图模型。如果你喜欢,你也可以在前面放一些简单的 WCF。

使用 MSMQ 时,所有消息都通过存储转发传递。这意味着它们在传递到服务器之前首先存储在客户端上,因此如果服务器关闭,消息会在客户端等待。对于容错,您将希望您的消息是可恢复的(写入磁盘) - 这是 NServiceBus 中的默认值,但不是标准 MSMQ 的默认值(不了解 MassTransit)。您不需要为此使用数据库。

In NServiceBus, the bus is not installed on a separate machine so you don't need to deal with its availability independently of the rest of the system. It's only when you look at scaling our your command processing to more nodes that you might consider using the message-based load balancer in NServiceBus (called the distributor) which, for high availability, should be installed on a cluster or fault-tolerant hardware.

于 2010-09-08T05:49:28.523 回答
8
  1. 这取决于它的设置方式,但在 MassTransit 中,您可以保持订阅处于活动状态,这样消息仍将被传递到数据库的队列中。当 DB 再次处于活动状态时,您可以读取队列中的消息。

  2. 在 MassTransit 中,连接到服务总线的每个服务都有自己的活动队列。消息将存储在那里。

  3. 我认为这是“取决于”... MassTransit 支持除 MSMQ 之外的其他 MQ,但实际上是围绕 MSMQ 构建的。我们没有经验丰富的支持,例如从 MSMQ 进行故障转移。然而,如果订阅服务(即总线)出现故障,一切都将继续正常运行——服务已经知道与谁交谈。只有当消费者(订阅或取消订阅)发生变化时才会出现问题。对我来说,这是几乎从未发生过的事件。

  4. 使用 MassTransit,我们使用 DB 来存储订阅状态,但所有消息都存储在 MSMQ 中。

如果您想了解这些回复中的更多详细信息或对 MT 有其他疑问,可以加入我们的邮件列表:http ://groups.google.com/group/masstransit-discuss 。

于 2010-09-07T22:40:54.683 回答