问题标签 [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.
.net - 在 .net 中具有持久存储的 Saga 实现。Masstransit Saga 的替代品?
我一直在使用带有 MassTransit 的自动状态机。我喜欢使用那个状态/传奇机器,尤其是它是如何配置和设置的,以及我可以为状态机提供实现合约以用作消息的事件。
这就是它的样子:
有哪些类似但未连接到 MQ 架构的替代 Saga 实现?我想我真正在寻找的是至少具有内存持久存储的状态机或 Saga 实现。
activemq - 类似于 MassTransit Saga 的 ActiveMQ 功能
ActiveMQ 中是否有任何替代 MassTransit Saga 功能的方法?作为一名学生,我学过MassTransit,现在想通过类比学习ActiveMQ..
c# - ReBus 相当于 NServiceBus Saga ReplyToOriginator
我正在与 ReBus 中的 Sagas 合作,根据我使用 NServiceBus 的经验,您可以回复 Saga 的原始创建者以提供更新,如下所示:
我没有看到使用 ReBus 的等效方法。有没有办法做到这一点,如果没有什么是好的模式(除了发起者轮询),我可以使用它来实现同样的目标?一个例子是尝试创建一个客户,而客户想知道它是什么时候创建的,然后再尝试更改它的地址。
这是我快速整理的客户场景的一个简单示例:
domain-driven-design - 聚合根:状态更改或因异常而失败或...?
聚合根是用来控制状态变化的——当前允许什么,不允许什么。如果允许状态转换,请继续。如果不是,你抛出一个异常,解释为什么不允许它。
但是如果状态改变因为已经处于请求状态而没有发生呢?
例如,如果您Approve
的聚合根上有一个方法,并且当它被调用时,状态已经被批准?
- 是否应该抛出“ XYZ 已获批准”的异常?
- 还是应该默默地忽略它?
- 还是应该再次“发出信号”状态更改(事件溯源,下一段)?
在我的情况下,我使用事件源,因此如果发生状态更改,则会发出一个事件。在我的事件流中包含没有真正状态更改的事件对我来说并不“干净”,因为我想确信这些事件实际上是由于状态更改操作而产生的。
有经验法则吗?
编辑:
在所描述的情况下,批准一个被批准的元素并不会真正受到伤害。所以倾向于这种方式(谢谢@Eben Roux,@guillaume31)。
但是让我们为它添加更多的香料(问题背后的实际问题):
认为:
- 消息总线
- 异步命令/事件处理
- 流程管理器
如果进程管理器(又名 saga)发出命令(异步)并想知道命令是否成功怎么办?我认为如果流程管理器不必关心这个实现细节,它会减少精神负担/错误源。
我看到了 3 种处理方法:
- 在总线上发送“带有 id ABC 的命令成功/失败”消息
进程管理器等待该消息而不是事件 - 如果进程管理器没有遇到异常,则使命令执行同步
,一切都很好,继续 - 另外引入一个新事件
ApprovalDeclined { WasAlreadyApproved = true }
,流程管理器等待这个事件 - 偏角是总历史的一部分,也许是一个优势,也许永远不需要......
我知道:“这取决于”
但是您能想到任何其他(更优雅/更容易/不同)的解决方案吗?您最喜欢的处理此问题的“流程管理器兼容”方式是什么?
saga - 如何确保我的 Axon Saga 收到与 AssociationProperty 匹配的事件的通知?
我有一个正在使用 Axon 开发的项目,但我的 Saga 没有正确执行。
My Saga 包含与此类似的行:
第一个事件正在触发一个开始 saga,并且还触发了 initialiseWorkflow 任务(它正确地创建了一组额外的步骤。)但是,当 SecondEvent 到达时(与 FirstEvent 具有相同的 UUID 关联属性值),saga 不会拿起那第二个事件。
我已经尝试专门包括以下行来增强关联,但这也不起作用:
具有讽刺意味的是,我有一个测试用例,使用正常工作的轴突测试框架,这类似于:
问题出现在我的端到端测试中,我将命令直接放入 CommandGateway,并直接在存储库中检查结果。
我已经仔细检查了 AnnotatedSagaManager 是否正在使用,并且确实如此。
有没有人对可能出现的问题有任何想法,或者我误解了 Sagas 应该如何工作?
编辑:还有一些更新:
1) 我注意到在直接关联 UUID 时需要使用 toString(),所以我尝试将值变成事件的字符串 - 没有进展。
2)我尝试打印出关联的值,发现不需要直接关联行(在start saga过程中关联了uuid)
3)我尝试将@StartSaga 放在 secondEvent 上,这达到了“Processing SecondEvent ...”的代码,但在一个新的传奇中。
更多了解,但还没有解决方案!
nservicebus - NServicebus 传奇性能
我在 NSB 传奇性能方面遇到了麻烦。我们有一个单一的传奇来编排长时间运行的会话。Saga 向不同的处理器发送大量消息,然后得到它的回复。我看到 sagas 队列包含大量传入消息。每条消息的处理速度非常快,但在处理下一条消息之间存在延迟。这是日志文件的一部分:
我们看到了 4 秒的延迟。那很慢。请帮忙,我的传奇有什么问题?
谢谢!
nservicebus - NServiceBus:如何归档已完成或终止的 sagas
this.MarkAsComplete();
当从 Saga 本身调用NServiceBus 时,至少在 RavenDB 持久存储中删除 Saga 数据。
当 Saga 完成或终止时,是否有内置方法来存档 Saga 数据?出于可追溯性的原因,我们需要这样的功能。
c# - NServiceBus Saga 多次处理消息类型给出并发异常
我们有一个处理多种消息类型的 NServiceBus 实现:
MessageData 是这样的:
CreateMessage 有一个 MessagePart,它在其处理程序中添加到 MessageParts。ConfirmMessage 更新特定 MessagePart 的状态。
这是场景:
1) 接收到第一个 CreateMessage。这将在 Raven 中创建 Saga,并将 MessagePart(状态为“1”)添加到 MessageParts。
2) 接收到第一个 ConfirmMessage。这会将 Saga 中第一个添加的 MessagePart 的状态更新为“1 2”。转到 RavenDB 中的文档时,可以在浏览器中看到这一点。
3) 接收到第二个 CreateMessage。这会向 MessageParts 添加第二个 MessagePart。查看数据时,第一个 MessagePart 的状态仍然是“1”而不是“1 2”,这会引发并发异常(ActualETag 不等于 ExpectedETag):
看起来 Saga 数据是按消息类型缓存的。是这样吗?有解决办法吗?
笔记:
我们正在使用多个 IAmStartedByMessages,但是当 ConfirmMessage 在 CreateMessage 之前时,此消息将被添加到队列中,直到 CreateMessage 被处理。
linux - 如何使用 RSAGA 解决“错误:工具”?
我在 Ubuntu 14 64 位版本上使用 R 3.1.1。我安装了 SAGA GIS 2.1.2 和 RSAGA 0.93-6。
到目前为止,一切似乎都很好。
rsaga.env() 有效,我使用:
因为在 64 位上,模块位于其他地方。获取库也可以:
但是当我尝试获取模块或其他任何东西时,它会给出一个奇怪的错误:
我发现 rsaga 正式不支持更高版本的 SAGA GIS 2.1.0 但是当我尝试 2.1.0 时,我得到另一个问题中描述的错误:https ://gis.stackexchange.com/questions/109497/rsaga- saga-cmd-2-1-0-error-inconsistency
我应该如何解决这个错误?
rebus - saga 中请求/回复的自相关
我想问一下,当我为 Request/Reply 做 saga 时,我是否理解正确,感谢这个https://github.com/rebus-org/Rebus/issues/105我可以ConfigureHowToFindSaga
留空?
如果是真的,最好在 Wiki 页面中提及它,以及在适配器中注册 saga 的需要 :)
下面的代码似乎可以工作,请您看看是否可以?