【问题标题】:Exception handling and state control in an Event Driven Architecture事件驱动架构中的异常处理和状态控制
【发布时间】:2014-02-20 12:52:47
【问题描述】:

我已经阅读了很多关于事件驱动架构 (EDA) 设计模式的文章,虽然它看起来异常强大(我敢看到漂亮吗?)我对两件事感到困惑:第一,如何控制条件逻辑,二,如何控制异常。

假设我想设计一些为 Ajax 消费公开的回调。回调将由前端以“用户名”和“密码”触发,我将返回一个本地化的“返回码”,指示成功或失败。

当用户成功登录时,假设我登录了它,发送管理和电子邮件,并开始一个会话。如果我使用的是基于 EDA 的模式,我可能会遇到以下情况:

用户登录 ->(调度事件,始终)->(记录、发送电子邮件、开始会话全部调用)

也就是说,登录回调将发送一些通知,向所有已注册的类发出监听该特定事件的通知。我的问题是,谁在确认 if 验证器对(用户名、密码)是否成功?从某种意义上说,这三个事件只有在身份验证正确时才有效。

所以,也许我会先触发一个事件,并且只有在成功的情况下才会触发其他事件:

用户登录 ->(Dispatches 事件,始终)-> 尝试登录用户(Dispatches 事件,如果成功)->(记录、发送电子邮件、开始会话全部调用)

虽然这可行,但我无法控制如何获得反馈。事件似乎遵循“一劳永逸”的思路;如何将代码返回到前端?也就是说,我看不到事件观察者向主题提供反馈的方式。

这继续进行异常处理;在这种情况下处理异常的最佳方法是什么?

感谢任何建议! 阿德里安

(虽然这在理论上可能无关紧要,但我正在尝试将其应用于 PHP)

【问题讨论】:

    标签: php design-patterns exception-handling event-driven-design


    【解决方案1】:

    EDA 很棒,但这并不意味着您应该在任何情况下都使用它。 EDA 的目的是提供解耦可扩展性,这是通过权衡不立即反馈和处理最终一致性来实现的。

    至少在 Web 应用程序中,EDA 最好实现为领域事件架构,即那些事件传达与领域(业务)相关的某些事情已经发生。

    您说得对,事件是“即发即弃”类型,因为它们表达了过去的某些东西,发布后其他感兴趣的组件会收到通知。但问题是这些组件对其他组件或事件源一无所知。请记住,重点是脱钩。

    用户登录等不是域操作,以“旧”方式实现它们要容易得多且可维护。虽然你想要一些解耦,但更多的是低级别而不是架构(高)级别的解耦。

    【讨论】:

    • 太好了,非常感谢迈克。我想我自己也得出了同样的结论,这不是“一刀切”的模式。只关注业务领域的 EDA 是否称为领域 EDA?
    • 什么都不叫。但如果你说领域事件模式,人们就会明白你的意思。
    • 太棒了。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 2016-10-16
    • 1970-01-01
    • 2011-10-13
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多