问题标签 [nservicebus-sagas]

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 回答
284 浏览

.net - 向 Saga 数据添加复杂类型

我正在尝试使用包含复杂类型的 SagaData 创建一个 Saga。

例如:

这可能吗?如果是这样,你如何映射它,这是一个反模式吗?我没有在网上找到任何关于这样做的资源,这让我相信我缺少一些东西。

0 投票
2 回答
665 浏览

testing - NServiceBus Saga 单元测试的依赖注入

我的问题类似于关于 DI for NserviceBus Handler for testing ( Handler ) 的问题。作为一种解决方案,您可以使用以下语法来使用构造函数注入:

我找不到在 Saga 测试中使用相同方法的方法。支持属性注入,看起来像这样:

但是,这种方法需要将我的依赖项设为公共属性。我想尽量避免它。

有没有办法使用构造依赖注入进行 Saga 测试?

0 投票
2 回答
641 浏览

nservicebus - 我们应该如何使用 nservicebus 处理长时间运行的进程

我知道这对很多人来说似乎很明显,但我的客户正在使用一种我不太方便的模式。

案例是,他们的客户发送存款或取款,通过 nservicebus 发送到第三方系统。第三方系统需要处理该交易,但可能需要数天,甚至数周才能完成交易。

今天的解决方案是创建一个 saga,它首先发送一条消息,将交易交给第三方系统。完成后,sagas 下一步是检查完成更新。如果事务未完成,则会发送 requesttimeout,“就像等待”。当达到超时时,再次执行相同的检查并发送新的 requesttimeout ......等等。这一个永恒的循环。它所做的其他事情就是一遍又一遍地用相同的 SagaTimeout 完全填充 ServiceInsight。

我一直在研究单反,但似乎人手不足。我只需要对特定消息而不是所有消息进行多次重试。

另外,第三方系统无法发送交易已完成的事件,这意味着我们需要轮询完成更新。

另一个,我认为更好的解决方案是保存交易状态,将交易发送给第三方并完成这个特定的传奇。然后有一个使用时间间隔检查完成更新的传奇。

以这种方式使用 sagatimeouts 是一种常见的模式吗?而且,让 saga/handler 只检查完成更新是不是更好的解决方案?

0 投票
2 回答
644 浏览

c# - NServiceBus 传奇数据未创建

我想知道是否有人可以提供一些见解,了解为什么在 NServiceBus 的神秘世界中没有创建我的传奇数据。

在 NBus 附带的所有配置和 XML 地狱(默认情况下)背后,我似乎无法让我的传奇数据工作。尽管我使用我可以访问 SQL 并可以创建表、存储过程等的 Windows 凭据通过调试模式运行端点,但无论出于何种原因都没有创建该表。

我可以复制和粘贴我的配置,但这很广泛,但是我会提供我认为对这篇文章有用的内容,但是如果您需要更多信息,请大声喊叫,我会答应的。

我想我想知道需要添加什么额外的魔法才能使它起作用?

干杯,DS。

行动中的传奇..

编辑 添加当前使用的版本。

0 投票
1 回答
2206 浏览

c# - Nservicebus 传奇超时

我有一个传奇,它每 30 秒检查一次 API 调用的状态,如果从调用返回的状态成功则传奇结束,否则传奇等待 30 秒并再次尝试。如果 API 调用在 60 分钟内没有返回成功响应,则 saga 超时并结束。

我无法让我的 60 分钟超时触发。我的代码是

谁能看到我哪里出错了?

谢谢

0 投票
2 回答
212 浏览

multithreading - NServiceBus 处理程序是否应该总是快速完成?

[为清晰而编辑]

我不确定我是否理解正确。

根据这些指导性的帖子,在 Saga 中,一切都应该简明扼要:

  • 乔纳森奥利弗的总结:blog.jonathanoliver.com/...
  • Udi Dahan 的原文:skillsmatter.com/skillscasts/...
  • 和一些早期的帖子
  • lostechies.com/jimmybogard/2013/03/26/scaling-nservicebus-sagas
  • docs.particular.net/nservicebus/architecture/principles

也就是说你的saga应该没有业务逻辑,里面也没有if-else指令。它应该只是一个协调器,调用它应该是“面向成功的”——也就是说:在调用 Saga 之前应该尽可能多地进行验证。

但是单独的处理程序(你称它们为“独立处理程序”吗?),那些不在 saga 中的处理程序呢?以下哪项对他们来说是正确的:

一个。saga 之外的 NServiceBus 消息处理程序是否应该总是快速完成,如果有一个耗时的操作将其传递给线程并完成?

湾。还是更好地“占用”处理程序,这样 NServiceBus “知道”该消息正在被大量使用,并可以相应地采取行动 - 即通过自动负载平衡,创建处理过程的另一个实例不同的工艺甚至不同的机器?

正确的方法是什么?

您能否提供一些示例代码以及您的答案,调用一个Foo.DoTimeConsumingBar()方法。

谢谢你。

0 投票
2 回答
153 浏览

nservicebus - NServiceBus - 使用相同的键排队 saga

场景:我用 10 个步骤构建了一个 saga。它正在更新各种系统,整个传奇可能需要几分钟才能完成。

传奇从另一个系统的数据开始,用户在其中输入客户的信息。

我无法看到用户何时在他们的系统中输入数据,但我每 x 分钟读取一次系统更改的数据。

我的问题是,每当我使用客户数据开始 saga 时,我需要确保同一客户的前一个 saga 已经完成。如果用户在输入数据上花费了 10 分钟,系统可能会针对同一个客户启动 5 个流程,并且流程可能会超过之前的流程,从而导致数据混乱。

有谁知道我该如何解决这个问题?

提前致谢。

奥莱

0 投票
1 回答
198 浏览

rabbitmq - 使用 RabbitMQ+RavenDB 的原型项目重复来自 RabbitMQ 的 SharedQueue 关闭错误

我创建了一个简单的 saga 原型项目,其中 RabbitMQ 作为传输,RavenDB 作为持久性机制。原型实际上按预期运行,但每隔几秒钟我就会收到此错误消息:

错误 NServiceBus.Transports.RabbitMQ.RabbitMqDequeueStrategy 无法从 [Assembly] 接收消息。重试 System.AggregateException:发生一个或多个错误。--> System.IO.EndOfStreamException: SharedQueue 在 RabbitMQ.Util.SharedQueue 1.EnsureIsOpen() at RabbitMQ.Util.SharedQueue1.Dequeue 关闭(int 32 毫秒超时.......

在上述消息之后,我也立即收到一条几乎相同的消息,但它说它无法接收来自 RabbitMGPoller.Timeouts 的消息

除此之外,还有不断的 INFO 消息说:NServiceBus.Transports.RabbitMQ.RabbitMqConnectionManager 与 RabbitMQ 代理断开连接,原因:AMQP 关闭原因,已启动库,代码 = 0 文本 =“流结束”...原因 = 系统.IOException:无法将数据写入传输连接:现有连接被远程主机强行关闭。---> System.Net.Sockets.SocketException: 现有连接被远程主机强行关闭...

我尝试将 DequeueTimeout=600 值添加到传输连接,但仍然会出现相同的错误。我也尝试在配置文件中添加以下键,但它似乎仍然没有帮助。

0 投票
1 回答
191 浏览

unit-testing - 验证 NServiceBus saga 是否不回复发起者

测试 saga 没有回复发起人的最佳方法是什么?

我看到使用 NServiceBus.Testing 我可以调用 Saga.ExpectReplyToOriginator,但我没有看到像“ExpectNotReplyToOriginator”这样的东西。我尝试使用 .ExpectNotSend() 和 .ExpectNotPublish() 并且似乎都没有在我期望的地方失败。

0 投票
1 回答
51 浏览

nservicebus - 优化 saga 查找

我有一个以并行线程从远程位置下载文件的过程。每个线程在开始下载时发送一条消息,在下载完成时发送第二条消息。两条消息都有一个下载 id 属性 (guid) 来关联两者。

接下来我有一个监控这些下载的传奇。它由 DownloadStarted 事件启动,并使用超时来检测是否及时收到了 DownloadEnded 事件。

我遇到的问题是,当在短时间内(1 分钟内下载 1000 个文件)下载大量文件时,saga 的性能并不是那么好。在某些时候,它需要半个多小时才能赶上。

我试图通过提供 IFindSagas 实现来加速 saga 查找。这并没有太大帮助,因为这导致 RavenDB 在 saga 数据中的 DownloadId 上创建一个自动索引,但也导致 FindBy 方法经常返回 null,因为该索引没有及时更新。

有没有其他方法可以尝试加速传奇?我正在考虑使用 DownloadId 作为 saga id,因为这已经是一个独特的 guid。saga 数据的 Id 属性是可设置的,但文档明确指出您不应该自己设置 id...

使用的传输:MSMQ 使用的持久性:RavenDB NServiceBus 版本:5