2

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

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

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

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

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

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

用户登录 ->(始终发送调度事件)-> 尝试登录用户(调度事件,如果成功)->(全部调用日志、发送电子邮件、启动会话)

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

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

感谢任何建议!阿德里安

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

4

1 回答 1

3

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

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

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

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

于 2014-01-29T12:53:44.190 回答