防止将机器名称附加到端点名称
本文关键字:端点 机器 | 更新日期: 2023-09-27 18:16:10
我们已经用NServiceBus开发了相当数量的服务,我们正在从使用MSMQ传输转换到使用SQL Server传输。
对于NSB托管服务,这是相对简单的。但是我们在设置我们的一些网站(asp.net web api)时遇到了一个问题。
我们在网站内自托管,配置如下:
NServiceBus.Configure.Serialization.Xml();
var bus = NServiceBus.Configure.With(/* specific assemblies */)
.CastleWindsorBuilder(container)
.DefineEndpointName(
ConfigurationManager.AppSettings["nsb:EndpointName"])
.DefiningCommandsAs(t =>
t.GetCustomAttributes(typeof(/* our marker */), false)
.GetLength(0) > 0)
.DefiningEventsAs(t =>
t.GetCustomAttributes(typeof(/* our marker */), false)
.GetLength(0) > 0)
.SetEndpointSLA(new TimeSpan(0,10,0))
.UseNHibernateTimeoutPersister()
.UseNHibernateSubscriptionPersister()
.UseTransport<SqlServer>() //<-- Changed here
.UnicastBus()
.LoadMessageHandlers()
//.DoNotCreateQueues() //We create queues manually.
.CreateBus()
;
我唯一改变的行是UseTransport<>
行(以前有Msmq
),并且,暂时,.DoNotCreateQueues()
行,因为我想强制它创建队列表(当我在IIS express下本地运行时)
问题是,当它创建队列表时,它将我的机器名称附加到"基本"表的名称上。也就是说,它创建的表(当EndpointName
应用程序设置为Service.Name
时)的形式是:
Service.Name.MYMACHINENAME
Service.Name.Retries
Service.Name.Timeouts
Service.Name.TimeoutsDispatcher
而当它创建MSMQ队列时,它创建:
Service.Name
Service.Name.Retries
Service.Name.Timeouts
Service.Name.TimeoutsDispatcher
事实上,已经更新到SQL Server传输的订阅服务器正在寻找Service.Name
队列表来注册它们的订阅。
我做错了什么,或者需要什么其他信息来解决这个问题?
我把这个确切的问题贴在了particar.net google组上。这是我从John Simons那里得到的解释:
原因是因为NServiceBus回调是使用一个内存字典,用于跟踪发送出去的消息id和消息id进来,换句话说Bus.Send()。注册(/*回调在这里*/)在您的网站,我们添加一个项到这个内存字典中,表示我们发出了一条消息id x,我们也存储回调委托,然后当我们接收到的消息我们检查字典和是否相关消息id匹配,我们触发回调委托。
所以这意味着如果你扩展你的网站(例如一个网站农场)在哪里将相同的端点部署到多台机器(如果是主机器)这些端点的队列名称与这些缩放后的端点名称相同输出端点可以接收到应该发送到a的消息特定的端点/机器,然后将失败,因为回调消息不会在内存字典中退出端点/机。
完整的线程在这里:
https://groups.google.com/d/msg/particularsoftware/W1RkPH6CBng/Ehiz0SPxKwoJPhil的回答让我想到了这个评论:
这是设计的。默认情况下,sql/rabbit/active将包含机器名称。我们的As_A_Server覆盖了这个:
原因是默认情况下支持回调Configure.ScaleOut(s=>s.SingleBrokerQueue());
在我们的例子中,我们不使用回调-我们是发布者,而不是客户端,所以这正是我们需要的修复。