公共交通 - 如何使用自定义活动
Masstransit - how to use custom activities
文档指出在
时应使用自定义活动
the complexity is best encapsulated in a separate class rather than
being part of the state machine itself
https://masstransit-project.com/usage/sagas/automatonymous.html#custom
我的问题是,您在 activity 中应该和绝对不应该做什么?例如,我应该进行 HTTP 调用吗?例如
public async Task Execute(BehaviorContext<OrderState, SubmitOrder> context, Behavior<OrderState, SubmitOrder> next)
{
//make an http call, possibly store the result in the saga instance.
**var result = await _httpclient.getAsync(myUrl);**
// call the next activity in the behavior
await next.Execute(context).ConfigureAwait(false);
}
我遇到过多个场景,其中 saga 收到一个初始事件,然后需要检索更多数据才能继续。这应该如何处理?寻找一些建议,提前致谢。
一般来说,不建议进行这些类型的请求(例如 HTTP)。 Sagas 在数据库事务的上下文中执行,因此添加外部依赖项(例如缓慢或可能不可用的 HTTP 资源)可能会导致并发吞吐量显着下降,如果 sagas 在外部系统上等待时被阻塞。
最好让一个单独的消费者负责查询远程系统,并且 send/publish 来自 saga 的命令,消费者将使用该命令检索数据并将其报告回 saga(要么通过响应,或 saga 观察到的事件)。
并发模式无关紧要。例如,如果 saga 正在等待 HTTP 请求,并且使用了乐观并发,如果在当前事件正在等待 HTTP 响应时另一个事件更新了 saga,那么当 saga 尝试持久化时,它将因 concurrency/version 冲突,因为它已被另一个事件更新。
因此,当谈到 sagas 时,应该以简短而有趣为目标,将所有繁重的工作委托给其他组件。 Sagas 应该编排工作,而不是自己做太多工作。
文档指出在
时应使用自定义活动the complexity is best encapsulated in a separate class rather than being part of the state machine itself
https://masstransit-project.com/usage/sagas/automatonymous.html#custom
我的问题是,您在 activity 中应该和绝对不应该做什么?例如,我应该进行 HTTP 调用吗?例如
public async Task Execute(BehaviorContext<OrderState, SubmitOrder> context, Behavior<OrderState, SubmitOrder> next)
{
//make an http call, possibly store the result in the saga instance.
**var result = await _httpclient.getAsync(myUrl);**
// call the next activity in the behavior
await next.Execute(context).ConfigureAwait(false);
}
我遇到过多个场景,其中 saga 收到一个初始事件,然后需要检索更多数据才能继续。这应该如何处理?寻找一些建议,提前致谢。
一般来说,不建议进行这些类型的请求(例如 HTTP)。 Sagas 在数据库事务的上下文中执行,因此添加外部依赖项(例如缓慢或可能不可用的 HTTP 资源)可能会导致并发吞吐量显着下降,如果 sagas 在外部系统上等待时被阻塞。
最好让一个单独的消费者负责查询远程系统,并且 send/publish 来自 saga 的命令,消费者将使用该命令检索数据并将其报告回 saga(要么通过响应,或 saga 观察到的事件)。
并发模式无关紧要。例如,如果 saga 正在等待 HTTP 请求,并且使用了乐观并发,如果在当前事件正在等待 HTTP 响应时另一个事件更新了 saga,那么当 saga 尝试持久化时,它将因 concurrency/version 冲突,因为它已被另一个事件更新。
因此,当谈到 sagas 时,应该以简短而有趣为目标,将所有繁重的工作委托给其他组件。 Sagas 应该编排工作,而不是自己做太多工作。