问题标签 [nservicebus-distributor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
73 浏览

nservicebus - nServiceBus Beta 连接关闭异常

我试图让 nServiceBus 示例启动并在 2 台电脑上运行。我构建了 Distributor 示例,添加了几个工作人员,它们都在本地运行。

如果我为 NServiceBus.Integration 或 NServiceBus.Production 添加命令行参数,主节点会延迟并抛出 .Net.WebException -“底层连接已关闭:接收时发生意外错误。” 所有的防火墙都关闭了,但我什至不必尝试在另一个节点上放置任何东西,在本地运行会导致异常,除了主服务器上的命令行之外没有更改任何内容。

问题 :

  1. 是什么导致了样本抛出?..我是否缺少允许多台物理 PC 各自托管一个逻辑订户所需的一些配置?

  2. 指定集成或生产配置文件是否意味着您现在需要为 subs 存储指定数据库?默认的内存存储将不再起作用吗?(只是为了让它启动和运行?)

  3. 许可证是否涵盖使用其他配置文件在多台 PC 上进行的测试?

  4. 是否有任何示例、文档或演练可以更深入地展示配置,尤其是在创建分布式工作人员方面?

我浏览了 NServiceBus 网站,阅读了几乎所有 Stack Overflow 帖子,但仍在努力完成这项工作!

非常感谢任何帮助!谢谢,罗伯

0 投票
1 回答
627 浏览

c# - NService Bus - 基于内容的路由和审计 - 我的方法好吗?

在我们的系统中设计消息流时,我很难决定采用哪种方式。

由于我们的业务流程(即计算运费)的易变性质,我们使用工作流框架能够即时更改流程。

一般过程应该是这样工作流处理过程
的 接口是一个服务,它通过客户提供的任何接口(webservices、tcp 端点、数据库轮询、文件,你命名它)连接到客户系统。然后向执行器发送一个命令,其中包含接收到的数据和要执行的工作流的 id。

第一个问题出现在我们想要在多个工作服务上分配负载的地方。
假设我们有不同的流程,例如打印包裹标签、计算价格、发送通知邮件。打印标签永远不应延迟,因为执行了大量的邮寄工作流程。所以我们希望能够根据他们所做的工作将命令路由到不同的工作人员。

因为所有命令都类似于“执行工作流 XY”,所以我们需要实现我们自己的基于内容的路由。NServicebus 不支持这个开箱即用,大多数时候是因为它是一种反模式。

当您无法使用不同的消息类型来路由消息时,是否有更好的方法来做到这一点?

当我们要添加监控时,第二个问题就出现了。因为端点只能为每种消息类型订阅一个队列,我们​​不能让所有执行者只发布“我完成了工作流”消息。当前的解决方案是将Bus.Send消息发送到预配置的审计端点。这对我来说有点像欺骗;)

有没有更好的方法将多个工作人员的已发布消息再次合并到一个队列中?如果没有问题#1,我认为所有工作人员都可以使用相同的输入队列,但是在这种情况下这是不可能的。

0 投票
1 回答
1104 浏览

nservicebus - nServiceBus:如何从事务操作的上下文中对数据库进行非事务调用

快速概览我们的拓扑:

网站向 nServiceBus 服务器发送命令,该服务器接受命令,然后发布正确的发布/订阅事件。该服务还具有消息处理程序,可以对数据库执行一些处理以响应命令,例如:

1 用户在网站上注册 2 网站向另一台服务器上的 nServicebus 服务发送 nServicebus 命令。3 nServicebus 服务器有一个处理该特定类型命令的处理程序,该处理程序将某些内容记录到数据库并发送一封欢迎电子邮件

自从建立这种架构以来,我们开始在数据库上遇到死锁。我已将其追溯到数据库服务器上的 MSDTC。如果我在数据库服务器上关闭该服务,nServicebus 开始抛出错误,这对我来说表明 nServiceBus 已经在事务中登记数据库更新。

我不希望这种情况发生,我想自己处理失败的数据库,我只希望事务确保消息传递到我的 nServicebus 代理服务。我不希望从网络一直到通过 2 个服务器到数据库再返回的事务。

有什么建议么?

编辑:这篇文章提供了一些线索,但是我不完全确定这是继续的正确方法.. NServiceBus - 在消息处理程序中使用 TransactionScopeOption.Suppress 的问题

EDIT2:我们希望数据库在事务范围之外工作的原因是目的是在另一台服务器上“异步”处理这些命令,以免减慢网站速度和/或导致用户等待这些时间运行聚合命令。如果数据库在事务范围内,是否会在向分销商发出原始命令时阻止网站上的执行?对于这种情况,是否有更好的 nServicebus 架构?我们希望命令快速触发并将控制权返回给网站,以便用户可以快速继续,而不必等待我们长时间运行的 DB 命令,该命令正在更新聚合计数和发送电子邮件等。

0 投票
1 回答
521 浏览

nservicebus - NServiceBus - 扩展订阅者在 master 和 worker 之间重复事件

我的核心问题是如何在 NServiceBus 中扩展订阅者。请让我知道我做错了什么或我错过了什么。我很乐意回答有关我的设置的任何问题。

设想:

我在尝试扩展订户时看到了我希望的不正确行为。我在机器 01 上安装了 master,在机器 02 上安装了 worker。我卸载了这两个服务并重新安装了“NServiceBus.Production NServiceBus.Master”作为 master 的命令行,但使用 NServiceBus.Worker 作为 worker 的命令行. 两个服务都运行良好,有两个线程可用。我在关闭服务的情况下运行场景的第一部分,队列计数如下面的第一个列表所示。注意到 Master 和 Worker 中的 816 条消息了吗?我以为使用 Production 命令行安装会导致两个服务共享相同的订阅信息,并且只有 master 会收到订阅的事件,但我错了。

第二组队列计数是启动两个服务并让它们完成处理的结果。请注意 02 上的工作人员服务如何处理他原来的 816 以及分销商给他的任何东西?

此处未列出主服务器的网关、重试和超时队列以及工作人员的重试和超时队列,因为在运行服务之前和之后,队列和日志的值均为 0

// 服务关闭* ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ***

格式名称:DIRECT=OS:vm-01\private$\creditalertnotificationprocessor.distributor.control

格式名称:DIRECT=OS:vm-01\private$\creditalertnotificationprocessor.worker

格式名称:DIRECT=OS:vm-01\private$\creditalertnotificationprocessor.distributor.storage

FormatName:DIRECT=OS:vm-01\private$\creditalertnotificationprocessor

FormatName:DIRECT=OS:vm-02\private$\creditalertnotificationprocessor

// 服务开启(并完成)* ** * ** * ** * ** * ** * ** * ** * ** * ** * ****

格式名称:DIRECT=OS:vm-01\private$\creditalertnotificationprocessor.distributor.control

格式名称:DIRECT=OS:vm-01\private$\creditalertnotificationprocessor.worker

格式名称:DIRECT=OS:vm-01\private$\creditalertnotificationprocessor.distributor.storage

FormatName:DIRECT=OS:vm-01\private$\creditalertnotificationprocessor

FormatName:DIRECT=OS:vm-02\private$\creditalertnotificationprocessor

工人配置文件...

0 投票
1 回答
150 浏览

nservicebus - NServicebus Publisher/Distributor 无法与所有订阅者/工作者进行通信?

我们有一个分发者/发布者(NSB 社区版本,位于域上,但由于某些问题最近更改为工作组模式),它与两个不同服务器(域上)上的两个工作人员通信。突然之间,它没有向其中一名工人发送任何工作,因为该工人已经发送了几条发布者未确认的确认。

请帮助 - 这是 NSB 主机中的错误还是我在这里遗漏了什么?

0 投票
1 回答
335 浏览

nservicebus - 工作节点处理来自两个分发器的消息

我在 nServicebus 组中有同样的问题。我没有得到支持此功能的确切答案。我喜欢把它贴在这里看看 SO 社区的想法。

http://tech.groups.yahoo.com/group/nservicebus/message/16487

我已经有处理来自分发服务器的消息的 Windows 处理器工作节点。现在我想扩展这个工作节点来处理来自另一个具有不同队列名称的分发器的消息。在查看单播总线配置时,发现只能设置一个分发器控制和数据地址。有没有办法在 NServiceBus 配置中设置多个分配器?如果您还解释了使用处理多个分销商的利弊,那将有所帮助。

0 投票
1 回答
814 浏览

c# - NServiceBus F5 负载均衡订阅者不使用分发器

我们正在寻找使用我们的 F5 来负载平衡 MSMQ 消息而不使用分发器(我们的 windows 框当前没有集群)。

使用数据库订阅存储和发布到 VIP,3 个订阅者会向发布者注册吗?(即 VIP 和两个订阅者?)

使用 MSMQ 事务队列将 1 个订阅者只处理消息吗?因为我们只想发布到 VIP,所以 1 台服务器会处理消息以及对原始服务器的回调会成功吗?

谢谢

0 投票
0 回答
398 浏览

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

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

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

现在真正的问题开始了,NServiceBus.Master 配置文件将 Node 值附加到输入队列上。当我们将 DNS 别名用作 Node 时,它​​会引发以下异常。

System.Exception:启动端点时出现异常,已记录错误。原因:输入队列 [somequeue@some-dns.bus] 必须与此进程 [SOMEDITSERVER01] 在同一台机器上。---> System.InvalidOperationException:输入队列 [somequeue@some-dns.bus] 必须与此进程 [SOMEDITSERVER01] 在同一台机器上。在 NServiceBus.Unicast.Queuing.Msmq.MsmqMessageReceiver.Init(地址地址,布尔事务)在 NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.NServiceBus.Unicast.Transport.ITransport.Start(地址地址)在 NServiceBus.Unicast.UnicastBus。 NServiceBus.IStartableBus.Start(Action startupAction) 在 NServiceBus.Hosting.GenericHost.Start()

--- 内部异常堆栈跟踪结束 --- 在 Magnum.StateMachine.EventActionList 的 NServiceBus.Hosting.GenericHost.Start() 处`1.Execute(T stateMachine, Event event, Object parameter)

--- 内部异常堆栈跟踪结束 --- 在 Magnum.StateMachine.ExceptionActionDictionary 1.Execute(T stateMachine, Event event, Object parameter) at Magnum.StateMachine.State 1 eevent, Object value) at Magnum.StateMachine.StateMachine` 1.RaiseEvent(事件引发)在 Topshelf.Internal.ServiceControllerProxy.Start() 在 Topshelf.Internal.ServiceCoordinator.Start() 在 Topshelf.Internal.Hosts.ConsoleHost.Run() 在 NServiceBus.Hosting.Windows.Program.Main(字符串 [] 参数)1.HandleException(T stateMachine, Event event, Object parameter, Exception exception)
at Magnum.StateMachine.EventActionList
1.RaiseEvent(T instance, BasicEvent

问题:

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

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

最后我们最终得到以下选项,

1.失败的方法:更改 IHandleProfile 上的 MasterNodeConfig 的 Node 值。我喜欢这种方法,但它几乎没有缺点。它不会工作,因为 MasterNodeConfig 没有覆盖 IsReadonly() 的默认行为,它会抛出错误。如果您使用集成配置文件,在安装期间它不会创建 Worker & Distributor 队列

有绕过上述代码创建的运行时错误的技巧。但是,如果您手动处理其他队列创建,我们可以使用它;

2.为worker和master保留两个不同的配置文件并打包。很多工作看起来是可行的。

3.在Master组件部署过程中移除MasterNodeConfig。

我不反对NSB,我喜欢NSB。我只是表达我的沮丧,想知道为什么!为什么它附加 MasterNode 值以及为什么它只是用 Environemnt 验证而不是解决它。

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

0 投票
2 回答
2763 浏览

nservicebus - 在 NServiceBus 3+ 中将超时管理器与分配器一起使用的正确方法是什么?

前 3 版的建议是将超时管理器作为独立进程在您的集群上运行,在分发服务器旁边。(详见此处: http: //support.nservicebus.com/customer/portal/articles/965131-deploying-nservicebus-in-a-windows-failover-cluster)。

在将超时管理器包含为卫星程序集之后,在与分发器进行横向扩展时,使用它的正确方法是什么?

服务 A 的每个工作人员应该在启用超时管理器的情况下运行,还是应该只将服务 A 的分发进程配置为运行服务 A 的超时管理器?

如果每个工作人员都运行它,他们是否共享相同的 Raven 实例来存储超时?(如果是这样,你如何确保两个或更多工作人员不会同时选择相同的过期超时?)

0 投票
1 回答
736 浏览

c# - NServiceBus Distributor 只需 2 步?

我在弄清楚如何使用分销商正确执行以下操作时遇到了一些麻烦:

  1. 创建一个发送命令的服务(分发器),这些命令分布在工作人员之间。如果我使用 IWantToRunAtStartup 实现启动 Distributor,我可以实现这种行为。见下文。
  2. 创建一个处理这些命令的服务(worker)。然后,我将启动 X 个实例来扩展该工作人员。
  3. 到目前为止,这一切都在同一台机器上。

NSB 中包含的示例有点难以理解,或者可能只是我个人 :)。

例如,我有一个分销商和一个工人:

经销商:

...

应用程序配置

工人:

...

应用程序配置

这适用于我的机器,并且可以很好地分配给我开始的任何数量的工人,但我没有错过什么吗,ScaleOut 示例似乎更复杂?

为什么我可以将工人作为分销商开始,然后看到工人表现得好像是工人,而实际上是作为分销商开始的?

如果我只是在工作程序 app.config 中添加队列名称/端点,这不会跨机器工作吗?