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

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

我刚刚开始学习服务总线体系结构,我不清楚的是如何处理服务总线的故障转移方案。

问题:

  1. 如果数据库服务器不可用,则发布的消息将会发生什么?
  2. 他们会被存储在某个地方吗?
  3. 我是否需要其他机器或集群来处理服务总线的故障转移?
  4. 我读到SQL Server可以用作消息存储,但是我可以使用耐用的MSMQ吗?我正在排队以将它们写入数据库,所以为什么我要将它们存储到数据库中,以便将它们存储在DB上只是为了将它们再次写入呢?或者,我弄错了,DB仅用于订阅列表,而不是用于消息?
有帮助吗?

解决方案

  1. 这将取决于设置的设置,但是在MassTransit中,您可以将订阅活动保持活跃,因此消息仍将传递到DB的队列。当DB再次处于活动状态时,您可以在队列中读取消息。

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

  3. 我认为这是一个“取决于” ... MassTransit在MSMQ以外对其他MQ有支持,但确实围绕MSMQ构建。我们对来自MSMQ的故障转移等事物没有很好的支持。但是,如果订阅服务(即公共汽车)失败,一切都将继续不错 - 这些服务已经知道与谁交谈。只有当消费者(订阅或取消订阅)的变化才会成为问题时。对我来说,这是几乎从来没有发生的事件。

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

如果您想在其中一个答复中的更多详细信息或有关MT的其他疑问,则可以加入我们的邮件列表: http://groups.google.com/group/masstransit-discuss.

其他提示

在实现这种体系结构的情况下,您应该考虑应用CQRS的原理 - 查询(此用户/PWD组合有效)不应通过总线进行;命令(Change PWD,忘记PWD)是通过公共汽车发送的,未作为事件发布。尽管在内部您可能会使用事件来保持命令和查询侧的同步,但这不涉及客户端。

可以使用简单的ado.net对DB的复制阅读奴隶进行查询 - CQR中所谓的持久视图模型。如果您愿意,也可以将一些简单的WCF放在前面。

使用MSMQ时,所有消息都是通过存储和前向传递的。这意味着它们首先将其存储在客户端之前,然后再将服务器交付到服务器上,因此,如果服务器关闭,则消息坐在客户端等待中。对于容错,您将希望您的消息可恢复(写入磁盘) - 这是Nservicebus中的默认值,但不是标准MSMQ的默认值(不知道MassTransit)。您不需要数据库。

在Nservicebus中,总线未安装在单独的机器上,因此您无需独立于系统的其余部分处理其可用性。只有当您查看将我们的命令处理扩展到更多节点时,您可能会考虑使用Nservicebus中的基于消息的负载平衡器(称为分销商),对于高可用性,应在群集或容忍耐故障的硬件上安装。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top