当前位置: 首页 > 知识库问答 >
问题:

同步关注点的事件源

白君之
2023-03-14

我努力理解如何使用事件源设计一个支持同步html" target="_blank">请求的事件驱动后端。据我所知,要利用事件源,您必须开发系统来响应事件,以便在必要时可以重播它们来重新创建您的状态。为此,这意味着我们正在尝试解耦事件触发器和事件处理程序。

如果我们假设一个客户端发送一个请求来更新一些数据,那么我们如何在使用事件驱动系统时适应这个同步请求/响应模型?您认为以下步骤是以事件驱动方式处理请求的正确方法吗?

>

  • 在API网关接收网络请求,或在网络边缘接收某些服务,并发出表示此请求的事件。此时的API网关将挂起并等待。

    发出的事件由事件存储捕获并记录

    具有处理更新的业务逻辑的服务在订阅事件存储时捕获事件。如果能够处理更新,则生成成功事件;如果无法处理更新,则生成错误事件。

    API网关接收其等待的成功或错误事件之一,并最终将响应发送回浏览器。

    我认为上面的内容对分离关注点有很大帮助,但我怀疑这是否是通过接受外部客户端请求的系统启用事件源的方式。

  • 共有1个答案

    屠昌胤
    2023-03-14

    你混淆了几个术语和想法,这些术语和想法必须分开。一旦你在脑海中把它们分开,一切都会变得清晰。

    事件源和事件驱动架构是两种不同的想法。事件源意味着您将对实体的所有更改保留在事件存储中,并将所有事件相加以获取该实体的当前状态。这个概念与状态的存储有关,而不是请求的处理。我认为您在这个问题中所指的是事件驱动的体系结构。将这些想法分开的必要性很快就会变得清晰。

    在事件驱动的体系结构中,有两种想法需要分开。有来自UI或外部系统的请求对数据进行一些更改;这是一条消息或请求。消息处理程序(在CQRS中通常称为命令)处理该请求,或者将其视为无效而拒绝,或者对系统中的实体进行适当的更改。然后,对这些实体的更改将作为事件存储在事件存储中。事件存储中的事件应仅包含已更改的数据,而不是实体的所有属性。如果命令更改了多个实体,则会将多个事件写入事件存储。

    系统可以具有事件存储的侦听器(或订阅服务器),并且可以启动其他业务逻辑以响应实体中的更改。这些更改以最终一致的方式异步运行。

    考虑到所有这些,我们可以讨论事件驱动体系结构如何处理同步和异步事件。请记住,EDA是为异步处理和最终一致性而设计的,因此使其同步是一项额外的工作。

    用你上面的四个步骤我们得到这个

    步骤1:描述的逻辑没有变化。网关接收请求(不是事件)并等待。

    步骤2:一些开发人员喜欢存储传入的请求以进行模式分析等,但不需要成功地处理请求。

    在最终一致的体系结构中,业务逻辑将对传入的请求进行一些基本验证,如果看起来不错,则返回操作成功的确认。请求将被放入队列中,并在方便的时候进行处理。如果遇到错误,稍后会通知用户。

    但是由于您的系统是同步的,API(您称之为API网关)将直接调用负责处理业务逻辑的服务-命令。

    步骤3:请求由命令处理,验证请求并对实体进行任何必要的更改。为所有实体更改创建事件(每个实体一个事件)。

    步骤4:该命令将成功或失败值同步返回给API,API将其返回给调用方。请注意,这应该是一个异步/等待调用,而不是来自API的阻塞调用。对API和用户来说,它看起来仍然像一个同步过程

     类似资料:
    • 我定义了一个表单字段的焦点事件,以打开一个Jquery UI对话框,其中包含可选择的选项。我希望焦点应该停留在相同的字段,以便不间断地输入数据。我的需求就像datepicker显示的那样,用户看到datepicker覆盖,但焦点停留在日期字段上,这样用户就可以继续输入日期。 下面是相关字段和对话框的代码。 下面是对话框Div with table。我正在使用jquery datatable插件填充

    • 的HADR配置 IBM DB2-http://pic.dhe.IBM.com/infocenter/db2luw/v9r7/index.jsp?topic=%2fcom.IBM.DB2.luw.admin.ha.doc%2fdoc%2fc0011724.html, MySQL-http://dev.MySQL.com/doc/refman/5.5/en/replication-semisync.h

    • 本文向大家介绍iOS UIView的Touch事件注意点相关面试题,主要包含被问及iOS UIView的Touch事件注意点时的应答技巧和注意事项,需要的朋友参考一下 如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件(掌握) UIView不接收触摸事件的三种情况: 不接收用户交互 : userInteractionEnabled = NO 隐藏 : hidden = YES 透明 :

    • 总述 中科大开源镜像站允许下游站点使用 rsync 协议同步站点上的内容。 因可能消耗大量服务器资源,我们非常不推荐下游镜像站点或个人用户使用 HTTP / HTTPS / FTP 协议从站点大规模同步数据。 我们可能采取技术措施对使用非 rsync 协议进行大量内容同步的用户进行限流或封禁。 rsync 同步方式 同步专用域名 如需使用 rsync 协议访问科大开源镜像站,请使用 rsync 专

    • 使用syncing参数订阅同步事件。当节点同步时将返回一个同步对象,否则返回false。 调用: web3.eth.subscribe('syncing' [, callback]); 参数: type:String - "syncing", 订阅类型 callback:Function - 可选的回调函数,其第一个参数为错误对象,第二个参数为结果 返回值: EventEmitter: 订阅对象

    • 拼命尝试编写https://www.npmjs.com/package/node-firebird#reading-blobs-aasynchronous的同步版本 基本上我需要(a)等两次: 执行回调函数,以便事件发射器可用 为结束事件发生 然后返回Buffer。 我的代码(现在是JS/TS混合代码)当前执行2,但不是1:readBlob返回未定义的,然后Buffer.concat(buffer