在多个站点(例如 herehere)上,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/

10-13 00:24