NServiceBus和具有MSMQ群集的远程输入队列

时间:2012-03-28 12:00:31

标签: msmq nservicebus

我们希望将NServiceBus的发布/订阅功能与MSMQ群集一起使用。让我详细解释一下:

  • 我们有一个SQL Server集群,它也承载MSMQ集群。除了SQL Server和MSMQ,我们无法在此群集上托管任何其他应用程序。这意味着我们的订户不允许在clsuter上运行。
  • 我们有多个应用服务器托管不同类型的应用程序(从ASP.NET MVC到SharePoint Server 2010)。目标是在所有这些应用程序之间做一个pub / sub。
  • 通过pub / sub发送的所有消息都很重要,对业务具有重要价值。这就是为什么我们不希望在应用服务器上使用本地队列,但我们想在群集上使用MSMQ(如果我们丢失了一个应用服务器,我们就不会有丢失消息的风险)因为它们在群集上是安全的。)

现在我假设我可以在订阅方简单地执行以下操作:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
    ....
  </configSections>

  <MsmqTransportConfig InputQueue="myqueue@server" ErrorQueue="myerrorqueue" 
        NumberOfWorkerThreads="1" MaxRetries="5" />
  ....
</configuration>

我假设过去曾见过支持,请参阅文档:http://docs.particular.net/nservicebus/messaging/publish-subscribe/

但这实际上引发了一个例外:

  

启动端点时出现异常,已记录错误。原因:   &#39; InputQueue&#39;进入&#39; MsmqTransportConfig&#39;部分已过时。通过   默认情况下,队列名称取自类命名空间所在的位置   配置已声明。要覆盖它,请使用.DefineEndpointName()   使用字符串参数作为队列名称或Func参数   返回队列名称。在这种情况下,&#39; myqueue @ server&#39;被定义为   作为队列名称。

现在,异常明确指出我应该使用DefineEndpointName方法:

        Configure.With()
                 .DefaultBuilder()
                 .DefineEndpointName("myqueue@server")

但是这会抛出另一个记录的异常(输入队列应该在同一台机器上):

  

启动端点时出现异常,已记录错误。原因:输入   queue必须与此进程在同一台机器上。

如果我无法在群集中使用MSMQ,如何确保我的邮件安全?

分派!

现在我也一直在调查调度员,这似乎也解决了我的问题。我还假设调度员无法从远程输入队列中获取消息?除此之外,如果调度员向工作人员发送消息,并且工作人员失败,我的消息也会丢失(即使他们没有被处理)?

问题?

总结一下,这些是我在NServiceBus中对我的场景感到困惑的事情:

  1. 我希望我的消息在MSMQ群集上是安全的,并使用远程输入队列。这是应该或不应该做的事情吗?是否可以使用NServiceBus?
  2. 在这种情况下我应该使用调度员吗?它可以从远程输入队列中读取吗? (我无法在群集上运行调度程序)
  3. 如果调度员向工作人员发送消息并且其中一名工作人员发生故障怎么办?我是否丢失了正在处理的消息?

2 个答案:

答案 0 :(得分:1)

Phill的评论是正确的。

问题是,如果设置虚拟化环境,默认情况下,您将获得所需的容错类型。在这种情况下,支持进程本地队列的C驱动器实际上位于SAN上的VM映像上。

答案 1 :(得分:0)

您将需要一个MessageEndpointMappings部分,您将使用该部分指向Publisher的输入队列。订阅服务器使用此队列来删除订阅消息。这需要是QueueName @ ClusterServerName。请确保使用群集名称而不是节点名称。订阅者的输入队列将用于接收来自发布者的消息,这些消息将是本地消息,因此您不需要@servername。

有两个级别的故障,一个是传输已关闭(比如MSMQ),另一个是端点关闭(Windows服务)。如果端点关闭,传输将处理将消息持久保存到磁盘。冗余网络存储设备可以是有序的。

如果传输已关闭,假设它是MSMQ,则消息将在发布者端备份。因此,您必须考虑邮件的大小和数量,以计算要备份邮件的时间长度。由于发布服务器是群集的,因此可以确保在假定您正确计划磁盘的情况下,消息最终会到达。