NServiceBus.Master配置文件执行期间的MasterNodeConfig行为

NServiceBus.Master配置文件执行期间的MasterNodeConfig行为,nservicebus,nservicebus3,nservicebus-distributor,Nservicebus,Nservicebus3,Nservicebus Distributor,我今天遇到了障碍。在我们的组织中,所有部署都由TFS Build完成。其中,每个NSB主机组件都由构建门户打包和部署。当我们尝试使用NSB的横向扩展功能时,我们必须使用主配置文件和辅助配置文件安装相同的组件。我们通过在打包时传递所需的参数来管理主安装程序和辅助安装程序。为了简化这个过程,我们计划为主节点和辅助节点使用一个配置文件,其中我们保留了主节点和辅助节点的主节点配置。一切都好!它运行得非常好 根据策略,我们不应该在配置文件中使用服务器名称,我们必须在配置文件中使用DNS别名。我们通过在DN

我今天遇到了障碍。在我们的组织中,所有部署都由TFS Build完成。其中,每个NSB主机组件都由构建门户打包和部署。当我们尝试使用NSB的横向扩展功能时,我们必须使用主配置文件和辅助配置文件安装相同的组件。我们通过在打包时传递所需的参数来管理主安装程序和辅助安装程序。为了简化这个过程,我们计划为主节点和辅助节点使用一个配置文件,其中我们保留了主节点和辅助节点的主节点配置。一切都好!它运行得非常好

根据策略,我们不应该在配置文件中使用服务器名称,我们必须在配置文件中使用DNS别名。我们通过在DNS别名之上启用MSMQ工作来实现它

现在真正的问题开始了, 主配置文件在输入队列上追加节点值。当我们使用DNS别名作为节点时,它抛出以下异常

System.Exception:启动终结点时发生异常,错误已被删除 记录。原因:输入队列[somequeue@some-dns.bus]必须位于 与此进程相同的计算机[SOMEDITSERVER01]。--> System.InvalidOperationException:输入队列 [somequeue@some-dns.bus]必须与此进程位于同一台计算机上 [SOMEDITSERVER01]。在 NServiceBus.Unicast.Queuing.Msmq.MsmqMessageReceiver.Init(地址 地址,布尔值(事务)位于 NServiceBus.Unicast.Transport.Transactional.Transactional.Transport.NServiceBus.Unicast.Transport.ITransport.Start(地址 地址)在 NServiceBus.Unicast.UnicastBus.NServiceBus.IStartableBus.Start(操作 startupAction)在NServiceBus.Hosting.GenericHost.Start()上

---内部异常堆栈跟踪的结束---at NServiceBus.Hosting.GenericHost.Start()位于 Magnum.StateMachine.EventActionList`1.Execute(T StateMachine,Event 事件(对象参数)

---内部异常堆栈跟踪的结束---at Magnum.StateMachine.ExceptionActionDictionary
1.HandleException(T
状态机、事件、对象参数、异常)
在Magnum.StateMachine.EventActionList上执行(T StateMachine,Event 事件,对象参数)在 Magnum.StateMachine.State
1.RaiseEvent(T实例,BasicEvent
1 e事件,对象值)在 Magnum.StateMachine.StateMachine`1.RaiseEvent(已引发事件)位于 位于的Topshelf.Internal.ServiceControllerProxy.Start() Topshelf.Internal.ServiceCoordinator.Start()位于 位于的Topshelf.Internal.Hosts.ConsoleHost.Run() NServiceBus.Hosting.Windows.Program.Main(字符串[]args)

问题:

当NSB严格寻找当前MachineName作为当前输入队列的有效服务器名称时,为什么NSB在输入队列和其他队列上追加MasterNode值? 为什么NSB在使用NServiceBus.Master或NServiceBus.Distributor运行时不忽略MasterNode值呢

如果NSB仍然希望在输入队列上附加MasterNode值… 为什么NSB不解析DNS名称,而是限制使用当前MachineName进行验证

var configSection = Configure.GetConfigSection<MasterNodeConfig>();
if (configSection == null)
{
    return;
}
var ipAddressesOfNode = Dns.GetHostEntry(configSection.Node).AddressList.Select(ip => ip.ToString()).ToArray();
var ipAddressesOfHost = Dns.GetHostEntry(Environment.MachineName).AddressList.Select(ip => ip.ToString()).ToArray();
if (ipAddressesOfHost.Any(ipAddressesOfNode.Contains))
{
    //Valid DNS Name
}
2.为worker和master保留两个不同的配置文件并打包。许多工作看来是可行的

3.在主组件部署期间卸下MasterNodeConfig

我不反对NSB,我爱NSB。我只是在表达我的沮丧,想知道为什么!为什么它要附加MasterNode值&为什么它只是用Environment验证而不是解析它


我非常乐意接受您的任何建议。

我提出了一个错误,请参见添加主节点地址也是我们将在4.0中解决的问题
internal class MasterNodeConfigSetup : IHandleProfile<Master> 
{
public void ProfileActivated()
{
var configSection = Configure.GetConfigSection<MasterNodeConfig>();
configSection.Node = Environment.MachineName;
} 
}
var field = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
if (field != null)
{
field.SetValue(configSection, false);
configSection.Node = Environment.MachineName;
}