我们希望将NServiceBus的发布/订阅功能与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中对我的场景感到困惑的事情:
答案 0 :(得分:1)
Phill的评论是正确的。
问题是,如果设置虚拟化环境,默认情况下,您将获得所需的容错类型。在这种情况下,支持进程本地队列的C驱动器实际上位于SAN上的VM映像上。
答案 1 :(得分:0)
您将需要一个MessageEndpointMappings部分,您将使用该部分指向Publisher的输入队列。订阅服务器使用此队列来删除订阅消息。这需要是QueueName @ ClusterServerName。请确保使用群集名称而不是节点名称。订阅者的输入队列将用于接收来自发布者的消息,这些消息将是本地消息,因此您不需要@servername。
有两个级别的故障,一个是传输已关闭(比如MSMQ),另一个是端点关闭(Windows服务)。如果端点关闭,传输将处理将消息持久保存到磁盘。冗余网络存储设备可以是有序的。
如果传输已关闭,假设它是MSMQ,则消息将在发布者端备份。因此,您必须考虑邮件的大小和数量,以计算要备份邮件的时间长度。由于发布服务器是群集的,因此可以确保在假定您正确计划磁盘的情况下,消息最终会到达。