php - 事件驱动架构中的异常处理和状态控制

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

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

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

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

用户登录 ->(始终调度事件)->(全部调用日志、发送电子邮件、启动 session )

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

所以,也许我首先触发一个事件,只有成功后,才触发其他事件:

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

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

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

感谢任何建议! 阿德里安

(虽然从理论上讲这可能并不重要,但我正在尝试将其应用于 PHP)

最佳答案

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

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

你说得对,事件是“一劳永逸”类型,因为它们表达了过去的某些内容,发布后可以通知其他感兴趣的组件。但问题是这些组件不知道其他组件或事件来源的任何信息。请记住,重点是解耦。

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

关于php - 事件驱动架构中的异常处理和状态控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21418894/

相关文章:

c - 处理器如何知道断点?

正在拆分的 Python 用户定义的异常字符串

PHP 数组输出为 JSON 格式

php - 按父级对 Eloquent 集合进行排序

php - mysql结构双唯一

swift - 如何避免函数流水线?

java - Spring Boot 异常处理

php - 从 SQL 查询重构数组,以便我可以回显正确的值

c# - Session Per Request 模式是如何工作的?

java - "new A()"和 "A.newInstance()"有什么区别?