我需要构建像Microsoft的http://login.live.com一样的身份服务器。
要处理故障转移,我将拥有多个Web服务器节点。计划是通过向数据库服务器发送消息来完成所有数据库写入操作。数据库将被镜像或复制。这个想法是数据库订阅写操作,但其他节点也订阅。这样,其他节点不需要从数据库读取并可以更新其缓存。
我刚刚开始学习服务总线架构,我不清楚如何处理服务总线的故障转移场景。
问题:
答案 0 :(得分:8)
这将取决于它的设置方式,但在MassTransit中,您可以使订阅处于活动状态,以便仍然可以将消息传递到数据库的队列。当DB再次处于活动状态时,您可以读取队列中的消息。
连接到服务总线的每个服务,在MassTransit中,都有一个自己的活动队列。消息将存储在那里。
我认为这是“依赖”...... MassTransit支持其他MQ而不是MSMQ,但实际上是围绕MSMQ构建的。我们没有经验丰富的支持,例如来自MSMQ的故障转移。但是,如果订阅服务(即总线)发生故障,一切都将继续无故障运行 - 服务已经知道与谁交谈。只有在消费者(订阅或取消订阅)发生变化时才会出现问题。对我来说,这是一个几乎从未发生过的事件。
使用MassTransit,我们使用DB来存储订阅状态,但所有消息都存储在MSMQ中。
如果您想了解其中一个回复中的更多详情或有关于MT的其他问题,您可以加入我们的邮件列表:http://groups.google.com/group/masstransit-discuss。
答案 1 :(得分:8)
在实现这种架构时,您应该考虑应用CQRS的原则 - 查询(此用户/ pwd组合有效)不应通过总线完成;命令(更改pwd,忘记密码)通过总线发送,不作为事件发布。在内部,您可能会使用事件来保持命令和查询方面的同步,这不涉及客户端。
可以使用简单的ado.net对数据库的replicated-read-slaves进行查询 - 这就是CQRS中的持久视图模型。如果你愿意,你也可以在它面前放一些简单的WCF。
使用MSMQ时,所有消息都通过存储转发传递。这意味着它们在被传送到服务器之前首先存储在客户端上,因此如果服务器关闭,则消息将在客户端等待。对于容错,您将希望您的消息可以恢复(写入磁盘) - 这是NServiceBus中的默认值,但不是默认的标准MSMQ(不了解MassTransit)。您不需要数据库。
在NServiceBus中,总线未安装在单独的计算机上,因此您无需独立于系统的其余部分处理其可用性。只有当您考虑将您的命令处理扩展到更多节点时,才可以考虑使用NServiceBus中的基于消息的负载均衡器(称为分发器),为了实现高可用性,应将其安装在集群或容错硬件上。