代码之家  ›  专栏  ›  技术社区  ›  Robert Vuković

带有NServiceBus或MassTransit的服务总线的故障转移场景

  •  4
  • Robert Vuković  · 技术社区  · 14 年前

    我需要像微软那样建立Identity Server http://login.live.com .

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

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

    问题:

    1. 如果数据库服务器不可用,发布的消息会发生什么情况?
    2. 它们会被存放在什么地方吗?
    3. 我需要额外的机器或集群来处理服务总线的故障转移吗?
    4. 我了解到SQL Server可以用作消息存储,但是我可以使用持久的msmq吗?我在排队等待消息,以便能够将它们写入数据库,那么为什么我要先将它们存储到数据库中,然后再将它们写入数据库呢?或者,我弄错了,db只用于订阅列表,而不用于消息?
    2 回复  |  直到 6 年前
        1
  •  8
  •   Stephen Kennedy annamataws    6 年前
    1. 这将取决于它的设置方式,但在MassTransit中,您可以将订阅保持活动状态,以便消息仍将传递到DB的队列。当数据库再次处于活动状态时,您可以读取队列中的消息。

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

    3. 我认为这是“视情况而定”…MassTransit支持除msmq以外的其他MQ,但实际上是围绕msmq构建的。我们对诸如从msmq进行故障转移之类的事情还没有得到很好的支持。但是,如果订阅服务(即总线)失败,那么一切都将继续运行,而服务已经知道该与谁交谈。只有当消费者发生变化(订阅或取消订阅)时,这才成为问题。对我来说,这是一个几乎从未发生过的事件。

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

    如果您希望在其中一个回复中获得更多详细信息或对MT有其他问题,您可以加入我们的邮件列表: http://groups.google.com/group/masstransit-discuss .

        2
  •  8
  •   Udi Dahan    14 年前

    在实现这种体系结构时,您应该考虑应用CQR的原则——查询(此用户/PWD组合是否有效)不应通过总线完成;命令(change pwd,forgot pwd)通过总线发送,而不是作为事件发布。在内部,您可能会使用事件来保持命令和查询端的同步,但这并不涉及客户机。

    可以使用简单的ADO.NET对数据库的复制读从服务器进行查询,这在CQR中被称为持久视图模型。如果你喜欢,你也可以在前面放一些简单的wcf。

    使用msmq时,所有消息都通过存储和转发传递。这意味着它们首先存储在客户机上,然后再被传递到服务器上,因此如果服务器关闭,消息就位于客户机上等待。对于容错,您希望消息可以恢复(写入磁盘)-这是NServiceBus中的默认值,但不是标准msmq的默认值(不知道MassTransit)。你不需要这个数据库。

    在NserviceBus中,总线没有安装在单独的机器上,因此您不需要独立于系统的其余部分来处理它的可用性。只有当您考虑将我们的命令处理扩展到更多节点时,才可以考虑在nservicebus(称为分发服务器)中使用基于消息的负载均衡器,为了获得高可用性,它应该安装在集群或容错硬件上。