在多个站点(例如 here 或 here)上,Sagas 被描述为一种机制,它监听域事件并对其使用react、执行新命令并最终修改域等。
Saga 和简单的事件调度程序(您让一些订阅者对事件使用react)之间有什么区别吗?
最佳答案
“saga”维护进程状态。更准确的术语是流程管理器。 “saga”一词由 NServiceBus 普及,这就是为什么现在许多人将其称为“NServiceBus saga”。真正的传奇是一个数据库概念。
无论如何,由于事件调度器对进程状态不感兴趣,因此它不是进程管理器。正如您所指出的,服务总线还可以充当事件调度程序,通常用于其他系统,尽管服务总线处理更多。
有一些方法可以在不使用 saga 的情况下处理进程状态,例如:路由表和“编排”。流程管理器更像是一种“编排”机制。
流程管理器可以让您的生活变得更简单,因此它的作用不仅仅是一个事件调度程序。
本质上,您的订阅者将与您的流程管理器交互以影响与流程相关的任何更改。
您可能会认为这有点像工作流程,您会是正确的。然而,工作流引擎是一件非常繁重的事情,而流程经理应该是你的 DDD 世界中的一等公民:)
流程管理器示例
以下只是一个快速的、不经意间的、广泛的样本。最初,用于创建成员的数据作为状态存储在流程管理器中。只有在验证了电子邮件地址后,才会使用其有效的电子邮件地址创建并存储实际成员。
然后发送一封欢迎电子邮件,可能使用服务总线。一旦收到来自 EMailService
端点的响应,即邮件已成功发送,该处理程序就会指示流程管理器电子邮件已发送,然后完成流程管理器。
所以会有一个 MemberRegistrationProcessRepository
。完成一个过程可能会导致它被归档甚至删除,如果它真的不再需要的话。
我怀疑事件溯源会很好地适用于流程管理器,但为了保持示例简单,我根据我之前自己实现的内容汇总了以下内容。
我之前还做过的是跟踪状态变化,我们有每个状态 15 分钟的 SLA。这会受到监控,并且所有流程管理人员处于状态超过 15 分钟都将报告给核心运营团队进行调查。
在 C# 中,可能有这样的事情:
public class MemberRegistrationProcess
{
public Guid ProcessId { get; private set; }
public string Name { get; private set; }
public EMailAddress EMailAddress { get; private set; }
public string Status { get; private set; }
public static MemberRegistrationProcess Create(string name, EMailAddress eMailAddress)
{
return new MemberRegistrationProcess(Guid.NewGuid(), name, eMailAddress, "Started");
}
public MemberRegistrationProcess(Guid processId, string name, EMailAddress eMailAddress, string status)
{
ProcessId = processId;
Name = name;
EMailAddress = eMailAddress;
Status = status;
}
public void EMailAddressVerified(IMemberRepository memberRepository)
{
if (!Status.Equals("Started"))
{
throw new InvalidOperationException("Can only verify e-mail address if in 'started' state.");
}
memberRepository.Add(new Member(Name, EMailAddress));
Status = "EMailAddressVerififed";
}
public void WelcomeEMailSent()
{
if (!Status.Equals("EMailAddressVerififed"))
{
throw new InvalidOperationException("Can only set welcome e-mail sent if in 'EMailAddressVerififed' state.");
}
Status = "WelcomeEMailSent";
}
public void Complete(Member member)
{
if (!Status.Equals("WelcomeEMailSent"))
{
throw new InvalidOperationException("Can only complete in 'WelcomeEMailSent' state.");
}
member.Activate();
Status = "Complete";
}
}
关于events - DDD,Saga 和 Event Dispatcher 的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32559725/