问题标签 [saga]

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

nservicebus - nservicebus saga 长时间运行的进程

我有一个长期运行的过程,有四个步骤。S1、S2、S3、S4。S2 和 S3 顺序运行,S1 可以与 S2 并行运行。S4 可以与 S1、S2 和 S3 并行运行。

并非所有流程都需要运行所有步骤。有些只需要 S2 和 S3。其他人可能使用 S2 和 S4。

现在可以创建一个 saga 类并处理 S1、S2、S3 和 S4。消息和超时处理程序中的许多 If 语句。下个月有人需要实现 S5,与 S3 和 S4 并行运行。

可以为每个可能的流程创建一个 saga,但这是许多重复的代码。是否可以通过在不同的 saga 类中实现所需的步骤来为每个步骤创建一个类并组成每个不同的流程?

我是否应该构建 4 个 saga 并从外部控制器控制流程,并且只使用 saga 来执行所需的超时和持久性?

0 投票
1 回答
131 浏览

soa - 文档处理 - 一个 Saga 案例?

我正在处理的应用程序的一部分涉及下载包含附件的电子邮件,检测每个附件中的条形码,扫描它以查找标识符并使​​用该标识符将数据插入数据库。

到目前为止,我对消息总线的使用仅限于 Pub/Sub,而且我从来没有真正需要使用 Sagas。但是,鉴于上述每个步骤都是同一相关流程的一部分,并且我们希望在流程的任何部分失败时保持持久性,那么 Saga 是否合适?

我们的过程的详细信息以及我认为我们可以如何使用 Saga 如下:

  1. Quartz 作业用于下载包含 PDF 附件的电子邮件。Quartz 作业使用Connector包含有关Tenant. Saga 将需要此租户信息,以便我们可以与租户特定资源(数据库/存储)进行交互。
  2. 对于每个 PDF 附件,我们启动一个“处理文档”Saga,将租户信息和文档本身(假设消息总线可以持久保存)或磁盘上文件的路径传递给它。为源电子邮件上的每个附件启动 Saga 后,连接器可以从邮箱中删除/存档电子邮件,以便不再处理它。

然后每个 Saga 将执行以下任务:

  1. 尝试从附件/文件中读取条形码。如果条码检测失败,我们需要将文件上传到指定位置,以便手动处理。这将完成 Saga。如果检测到条形码我们将解码数据库标识符。
  2. 使用标识符,我们Order从数据库中加载相关记录,如果它存在:
    1. 将文件上传到返回 URI 的指定位置
    2. 在我们的数据库中插入一条OrderDocument引用文件 URI 的新记录。
  3. 我们更新一个OrderDocumentBundle包含与订单相关的所有文档的单个文件。因此,当创建一个新的时,我们应该为相关OrderDocument加载并附加新的页面。OrderDocumentBundleOrderOrderDocument
  4. 传奇完成。

我担心最终捆绑过程中的并发问题,因为我们可能有多个消息试图更新捆绑包。我们需要确保 Saga 等待捆绑文件可用以完成。

0 投票
1 回答
118 浏览

timeout - nservicebus saga 在使用超时时如何保存数据以及在超时后启动时如何保持相关性

我有 saga,由于某些要求,我们需要延迟处理消息。

我正在考虑使用超时。我想知道 saga 怎么会知道进程旁边的消息以及它如何关联..

0 投票
2 回答
266 浏览

r - 错误:可以找到模块 RSAGA

我正在尝试在 RSAGA 中为 Channel 网络执行模块,但是当我运行这部分代码时:

我收到此错误:

错误:找不到模块:shapes_grid

任何想法如何解决这个问题。谢谢!

0 投票
1 回答
512 浏览

nservicebus - 由 Saga 处理两次的单个 NServiceBus 消息

我有一个 NServiceBus 版本 3.3.8 Saga,我正在努力从 NServiceBus 2.6 迁移。升级后,我发现队列中的一条消息被 saga 处理了两次。最奇怪的是 NServiceBus 将其视为两个单独的传输消息,因为我的 IMessageModule 实现也被调用了两次。

它正在接收的消息是绑定到 NServiceBus 2.6 的消息。有没有人见过这个?起初我认为这是一个依赖注入问题,因为我们正在从 Unity 切换到 Autofac,但这似乎并不能解释 MessageModule 被调用两次的问题。

感谢您提供的任何帮助。

更新

事实证明,这个问题是我无意中创建的依赖注入问题。saga 有一些额外的依赖项需要 IBus,而 IBus 是一个属性并通过属性注入设置。使用 Autofac 模块,我尝试通过覆盖 AttachToComponentRegistration 并在所有已注册项目上注入属性来简化配置,如下所示:

但是,这导致了上述问题。为了修复它,我删除了这个覆盖并通过调用手动设置属性注入:

这解决了我的重复处理问题。我仍然不确定它为什么会导致问题,但删除该覆盖确实阻止了重复的消息处理。

0 投票
1 回答
2254 浏览

c# - Nservice bus sagas implemetation

I have a nservice bus project which which i will call connector. My connector receives variouis kinds of messages for example ClientChangeMessage, ClientContactChangeMessage. My connector has not implemented saga so i have handler for each message so for ClientChangeMessage I have ClientChangeMessageHandler which gets fired when connector receives ClientChangeMessage and a ClientContactChangeMessageHandler when i receive a ClientContactChangeMessage.

Now while looking at the sagas implementation i found myself writing the following code (If the Client contact message comes before the ClientChange message i.e the client does not exist in the database):

As can be seen from the example I now have to implement the handle for the CLientChangeMessage as well , now i have already defined a handler for my ClientChangeMessage ,do i have to handle it again over here because if further on in time the ClientChangeMessage does come i would expect it to be caught and processed by the ClientChangeMessageHandler nad not by this one.

I would like to store a message if and only if i don't find the local reference for the Client in my database . Looking at the examples for saga on the web i dont't see any particular place or condition where this would be handled. I am hoping i would be storing the message inside the ClientContactChange handle method.

Any help would be much appreciated,

Thanks

UPDATE:

It would seem that i did not understand properly how to implement NService Bus Saga. The mistake which i made here according to me was that I considered A Client Contact change to be a single entity i.e independent of the Client Change message. So therefore i think i ma wrong in implementing the Saga just for client contact change . Here is how I had to change my code:

0 投票
1 回答
262 浏览

asp.net - MassTransit RuntimeServices RabbitMQ - 将其与 NuGet MassTransit 安装集成?

我有一个将 MassTransit 和 RabbitMQ 用于消息传递总线的 ASP.NET 项目,我正在尝试实现 MassTransit Sagas,我想使用 Saga 的 ScheduleTimeout 功能,这需要 MassTransit.RuntimeServices (TimeoutService)。

但是,据我了解,MassTransit 的 NuGet 安装不包括 RuntimeServices,这对我来说似乎很愚蠢,但好吧。

因此,我尝试将 MassTransit.RuntimeServices 和 MassTransit.RuntimeServices.Database 提取出来并将其直接包含在我的项目中,这会导致许多错误,包括无法解析或恢复的引用以及在其中普遍使用 msmq 而不是 rabbitmq运行时服务。

在我一起破解它以停止引用错误并尝试用 rabbitmq 引用替换 msmq 后,该应用程序在运行时引发异常,然后完全破坏了我的应用程序,需要卸载 RuntimeServices 项目并重新启动服务器。

有没有人知道如何将 RuntimeServices 集成到使用 Rabbit MQ 而不是 MSMQ 的 NuGet 安装版本的 MassTransit 中?

谢谢

0 投票
1 回答
166 浏览

nservicebus - 如何让我的 saga finder 执行?

我有一个看起来如下的 sager finder,我在 Findby 方法的第一行设置了一个断点,但它似乎永远不会执行。还有什么我需要做的吗?

0 投票
1 回答
607 浏览

nservicebus - NServiceBus 传奇到传奇通信是反模式吗?

我们有两个长时间运行的 saga,它们都运行了无限时间并响应超时。第一个每 15 分钟订阅一次超时,第二个每 24 小时订阅一次。每个 saga 都会跟踪自己的执行时间,并在开始运行和完成时通知其他 saga。由于数据库争用,这些 saga 负责的批量数据加载无法同时运行。

当第一个 saga ( Saga A- 15 min) 开始时,它首先检查(使用内部变量)以查看第二个 saga ( Saga B- 24 hr) 当前是否正在运行。如果不是,它开始它的处理步骤(脱壳到另一个进程,并随着时间的推移轮询它以查看它何时完成)。这两个 sagas 通过发送消息进行通信,以便在它们启动或完成时相互通知。

出于某种原因,这在两个层面上对我来说似乎很臭:

  1. 我们基本上有一个永远不会完成的单例传奇。这本身就是一种反模式吗?
  2. 我们双向发送消息的唯一目的是修改状态。似乎应该有更好的方法来处理这种情况。随着 NSB 4.0 的发布,我们开始在执行sending命令时遇到错误。当我们改用 pub-sub 方法时,错误就被清除了。

这是否被认为是 NServiceBus 实现反模式,对于这种需求是否有更好的模式?

0 投票
1 回答
1204 浏览

nservicebus - NHibernate 围绕列表的 NServiceBus SagaData 持久性问题

当我尝试存储这个 sagadata 时,我遇到了错误,而且也是因为 List。一旦我删除此列表,它就可以存储数据。