问题标签 [event-driven-design]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
distributed-computing - 使用 MDA 时,是否应该区分幂等和非幂等事件处理程序?
该问题假设使用事件溯源。
通过重放事件重建当前状态时,事件处理程序应该是幂等的。例如,当用户成功更新其用户名时,UsernameUpdated
可能会发出一个事件,该事件包含一个newUsername
字符串属性。重建当前状态时,适当的事件处理程序接收UsernameUpdated
事件并将对象上的username
属性设置为事件对象的属性。换句话说,多次处理相同的消息总是产生相同的结果。User
newUsername
UsernameUpdated
但是,当与外部服务集成时,这样的事件处理程序是如何工作的呢?例如,如果用户想要重置他们的密码,该User
对象可能会发出一个PasswordResetRequested
事件,该事件由一部分代码处理,该部分代码向第 3 方发出发送 SMS 的命令。现在,当应用程序重新构建时,我们不想重新发送此 SMS。如何最好地避免这种情况?
domain-driven-design - 具有副作用的事件溯源
我正在使用熟悉的事件溯源模式构建服务:
- 收到请求。
- 聚合的历史被加载。
- 聚合被重建(从它的历史)。
- 准备好新事件并更新聚合以响应来自步骤 1 的传入请求。
- 这些事件被写入日志,并可供任何订阅者使用(发布)。
就我而言,步骤 5 分两部分完成。事件将写入事件日志。后台进程从事件日志中读取并发布从偏移量开始的所有事件。
在某些情况下,除了与聚合相关的事件之外,我还需要发布副作用。就系统而言,这些也是事件,因为它们被其他服务消费并影响其他服务的状态。但是,它们不会影响此服务中聚合的历史记录,也不需要重建它。
我应该如何在代码中处理这些?
选项 1 - 不要将副作用事件写入事件日志。在第 5 步之前的主流程中发布这些内容。
选项 2- 将所有内容写入事件日志并在加载历史记录时忽略副作用事件。(这些不是历史的一部分!)
选项 3- 将副作用事件写入虚拟聚合,以便发布它们,但从不加载。
选项 4-?
在第一个选项中,如果存在并发冲突,可能会出现问题。如果第 5 步写入失败,那么副作用就不能轻易回滚。第二个选项写入不属于聚合历史的事件。在步骤 2 中加载时,必须忽略这些副作用事件。第三个选项感觉就像一个黑客。
你觉得这些中的哪一个是正确的?
c++ - C++ 中的事件驱动设计
在我的事件驱动应用程序中,我遇到了常见问题。假设如下类图:
我在这里使用观察者模式。Worker
并且WorkerManager
生活在同一个线程中。现在假设动作序列:
Worker
在方法中间调用监听器类报告结果WorkerManager
(监听器Worker
)决定删除/修改Worker
类Worker
继续执行方法,删除modified。程序员必须考虑这些情况,而且复杂且容易出错。
在代码中它可能看起来像这样:
如何修改:
现在我看到了这些问题的解决方案:
- 由代码样式指南设置,必须最后调用侦听器类。但它非常脆弱且容易出错的解决方案。
- 制作了某种 QT 排队连接。
QT 排队连接是在元对象系统上建立的,这对我的项目来说太多了。我需要一个更简单的工具,允许我在线程的事件循环中推迟侦听器回调。
我相信这个问题在事件驱动设计中很常见。我在哪里可以看到如何处理它的示例?
java - 测试事件驱动架构
我想问一下,是否有任何测试事件驱动架构的指导。
我的意思是创建自动测试,它将检查服务 A 产生的事件是否仍然可以被服务 B 使用。
我知道有用于 Rest 通信的 Pacto,但是 event 呢?
node.js - 在 nodejs 中以非事件驱动的方式编程是个好主意吗?
为了分离业务逻辑和数据访问层,我以非事件驱动的方式分离了文件和文件夹。这是我采取的用户注册过程的示例,这是我的业务逻辑层文件。
这是我的数据访问文件
这是一个真正的中大型项目,作为 nodejs 的新手,我想知道如果我采用这种设计方法会有什么问题吗?
java - ZeroMQ,我们可以使用inproc:传输以及发布/订阅消息模式吗
设想 :
ZeroMQ
我们正在(特别是)评估jeroMq
事件驱动机制。
该应用程序是分布式的,其中多个服务(发布者和订阅者都是服务)可以存在于同一个 jvm 或不同节点中,这取决于部署架构。
观察
为了玩耍,我使用 jero mq (版本:0.3.5)创建了一个pub
/sub
模式inproc:
作为传输
- 线程发布能够发布(看起来像被发布了,至少没有错误)
- 在另一个线程中的订阅者没有收到任何东西。
问题
inproc:
与pub
/sub
一起使用是否可行?
尝试谷歌搜索,但找不到任何具体的信息,任何见解?
pub
/ sub
with的代码示例inproc:
使用 jero mq(版本:0.3.5)的 inproc pub sub 的工作代码示例对以后访问这篇文章的人很有用。一个发布者发布主题A
and B
,两个订阅者分别接收A
andB
c++ - 事件驱动模拟器中同时发生的事件
我一直在尝试开发一个简单的事件驱动模拟器并从这里开始
http://stdcxx.apache.org/doc/stdlibug/11-3.html
当我对示例进行一些修改时,我遇到了一种情况,即当两个事件(到达、离开)同时发生(比如在时间单元 5)时,模拟器只会弹出顶部的任何内容从下面的代码片段可以看出事件队列。
如果两个事件同时发生,我该如何强制在出发事件之前总是弹出某个事件(到达事件优先)的条件。
任何帮助深表感谢。
node.js - How to read large binary files in node js without a blocking loop?
I am trying to learn some basics of event driven programming. So for an exercise I am trying to write a program that reads a large binary file and does something with it but without ever making a blocking call. I have come up with the following:
I know I need to put a while loop in order to read complete file but in the above code I am reading just the first 1024 bytes of the file and cannot formulate how to continue reading the file without using a blocking loop. How could we do it?
amazon-web-services - 使用多个主机处理来自 AWS SQS 的消息
我有一个涉及 的应用程序AWS SNS
,SQS
需要在多个主机上运行。确切的问题描述是:
每当发生事件时,都会将包含的消息ID
发布到订阅了 SQS 队列的 SNS 主题。现在我在队列中收到消息。现在,我希望多个主机从队列中读取消息(没有两个主机应该读取相同的消息)并将消息写入 Amazon S3 中的一个公共文件。应该考虑诸如“如果主机读取消息失败怎么办”和“不在同一主机或不同主机中两次读取同一消息”等问题。
谁能建议一些方法或一些参考资料,我可以通过这些方法或参考资料来完成这项任务?