问题标签 [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.

0 投票
1 回答
4949 浏览

c++ - 事件驱动编程——事件循环?

我只是想知道,事件循环的任何实现是否绑定到特定于平台的代码?

通过事件循环,我指的是一个简单的线程,它正在检查队列、处理消息并适当地分派给回调。

因为我根本看不出我怎么能写一个而不必使用示例:

-信号量/互斥体/事件对象/Sleep() [windows]。

当然,对于每个操作系统,上述内容并不相同。

顺便说一下,这是针对 C/C++ 的。

0 投票
3 回答
28592 浏览

multithreading - 在 Spring 中使用什么样的“EventBus”?内置、Reactor、Akka?

我们将在几周后开始一个新的 Spring 4 应用程序。我们想使用一些事件驱动的架构。今年我到处阅读有关“Reactor”的信息,在网上寻找它时,我偶然发现了“Akka”。

所以现在我们有3个选择:

我找不到真正的比较。


现在我们只需要类似的东西:

  • X注册监听Event E
  • Y注册监听Event E
  • Z发送一个Event E

然后XandY将接收并处理该事件。

我们很可能会以异步方式使用它,但肯定会有一些同步场景。我们很可能总是发送一个类作为事件。(Reactor 示例主要使用字符串和字符串模式,但它也支持对象)。


据我了解,ApplicationEvent默认情况下同步Reactor工作并以异步方式工作。并且Reactor还允许使用该await()方法使其有点同步。Akka提供或多或少的相同Reactor,但也支持Remoting。

关于 Reactor 的await()方法:它可以等待多个线程完成吗?或者甚至可能是这些线程的一部分?如果我们从上面举个例子:

  • X注册监听Event E
  • Y注册监听Event E
  • Z发送一个Event E

X 是否可以通过说:等待并 Y完成来使其同步。是否有可能让它只等待X,而不是等待Y


也许还有一些替代品?例如 JMS 呢?

很多问题,但希望你能提供一些答案!

谢谢!


编辑:示例用例

  1. 当特定事件被触发时,我想创建 10000 封电子邮件。每封电子邮件都必须使用用户特定的内容生成。所以我会创建很多线程(max = system cpu cores)来创建邮件并且不会阻塞调用者线程,因为这可能需要几分钟。

  2. 当特定事件被触发时,我想从未知数量的服务中收集信息。每次获取大约需要 100 毫秒。在这里我可以想象使用 Reactor 的await,因为我需要这些信息来继续我在主线程中的工作。

  3. 当特定事件被触发时,我想根据应用程序配置执行一些操作。因此应用程序必须能够动态(取消)注册消费者/事件处理程序。他们会用事件做他们自己的事情,我不在乎。所以我会为每个处理程序创建一个线程,然后继续在主线程中完成我的工作。

  4. 简单的解耦:我基本上知道所有的接收器,但我只是不想在我的代码中调用每个接收器。这应该主要是同步完成的。

听起来我需要一个 ThreadPool 或一个 RingBuffer。这些框架是否有动态的 RingBuffers,如果需要,它的大小会增加?

0 投票
1 回答
1510 浏览

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

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

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

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

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

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

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

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

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

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

感谢任何建议!阿德里安

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

0 投票
1 回答
93 浏览

c# - 我正在尝试为一项任务制作 c# 事件益智游戏

我让图片框移动。但是当我点击图片框时,它会跳遍整个地方。任何人都可以帮我解决这个问题吗?

0 投票
0 回答
173 浏览

php - 将同步代码包装到异步 PHP 中

假设我有一个阻塞的长时间运行的进程,它使用 SoapClient 连接到 web 服务,是否可以将普通代码包装成异步方式,我知道我可以使用不同的库发送并行 Soap 请求,我只想知道是否可以将阻塞进程包装成异步方式?

在正常模式下,发送阻塞请求并等待响应。

在我的需要中,一次发送多个阻塞请求,就像一个多处理但在一个进程中完成的工作。

0 投票
1 回答
1226 浏览

c# - DDD - 跨有界上下文边界聚合根身份使用

在域模型中对实体身份进行建模的一种建议方法是创建值对象而不是使用原始类型(C# 中的 fe):

在我看来,这些类应该在整个应用程序中使用,而不仅仅是在域模型中。连同命令和事件,它们可以为有界上下文定义服务契约。现在,在具有多个有界上下文且每个都有单独的服务契约的消息/事件驱动架构中,很容易陷入循环依赖关系。

在有界上下文之间的通信中,您将拥有适配器和翻译器,并且通常大多数属性将被处理为本地值。但是如何处理生活在其他有界上下文中的聚合根的身份呢?这个问题的一种解决方案是为外部(远程)实体的身份类创建本地上下文兄弟类。但这在某种程度上违反了 DRY 原则。另一种方法可能是将所有有界上下文的合同放在一个程序集中。我在许多 CQRS 示例中都看到了这一点,我认为这是代码异味。作为最后的解决方案,可以在所有合约(事件和命令)中将身份类分解回原始类型,并让每个有界上下文在域模型中组合回他的本地身份类(如果需要)。

您如何在项目中处理跨有界上下文边界的身份共享?

0 投票
1 回答
71 浏览

java - 在 apache camel 中使用异步事件的调试错误

我在我的应用程序中使用 apache camel。我camelContext producerTemplate用来发送消息:

消费者看起来像这样:

这在我的开发环境中运行良好。但是在生产中,尽管生产者发送了消息,但我根本看不到消费者的控制权。我也没有在日志中看到任何错误。有没有办法调试这个?dev 和 prod 环境之间的唯一区别是我设置了一个代理来与 Internet 上的服务进行通信。

0 投票
0 回答
813 浏览

java - 了解 Spring MVC 应用程序中的事件驱动

我已经阅读了这个 Spring MVC 应用程序的代码:

https://github.com/spring-guides/tut-rest/tree/master/6/complete/src/main/java/com/yummynoodlebar/core/events

我不了解事件文件夹中这些类的作用。我怎样才能在应用程序的另一个地方捕捉到这样的事件?

在这个应用程序中我不明白的另一件事是为什么他们不在服务层的某处使用命令查询分离。他们在休息控制器上使用了 CQS。我不同意这一点,相反,他们应该在服务层上使用 CQS 来提供一种简单的方法来向他们的服务添加验证或其他核心操作。这个链接描述了我所说的服务层上的 CQS 分离。

如果您对如何实现上面链接中描述的 CQS 模式有任何建议,请告诉它。

0 投票
1 回答
178 浏览

java - Javafx - 我应该创建一个静态类来控制我的 AI 还是为每个类创建一个对象?

我正在制作一个扑克游戏(Texas Hold Em),我想知道我是否应该制作一个控制所有 AI 的静态类以简单起见,或者我是否应该将其本身作为一个实例,以便每个玩家都可以使用不同的算法? 我的意思是它是扑克,所以我想在策略上可能会有一个不错的范围,但我可能会创建一个静态类,随机选择一个统计比率来进行决策……我不想要一个完全可预测的无聊 AI

目前我有一个对象将卡片表示为字符串,当从卡片字符串数组传递一个字符串时,它返回其 ImageView 等效项,然后我有一个对象用于指示当前可以做什么和不可以做什么以及根据公共牌分析最佳手牌并返回玩家拥有的手牌类型并临时存储组成该手牌的牌,以防两个玩家拥有相似的手牌并需要确定哪一个获胜。然后我有一个玩家类,它基本上设置了该玩家是否过牌跟注或弃牌。

编辑:我还改写了大约 3x 的发牌方式。我基本上是在尝试以这样一种方式设计游戏,以便以后可以添加不同的扑克风格,甚至可能是二十一点

0 投票
1 回答
1632 浏览

.net - MassTransit:消息合约、多态性和动态代理对象

TL;DR 关于合约订阅,我如何获取原始消息内容或原始发布的对象,而不是动态代理?

我在尝试创建基于 MassTransit 的模块化应用程序时遇到了麻烦。

我的想法是让 Websocket 服务器连接到队列,它从套接字读取事件并将其作为“连接请求”插入队列,并从队列中读取事件并将它们作为“连接事件”发送到套接字。两者都有一个契约,允许 WS 服务器知道事件要连接到哪个连接,以及系统的其余部分来自哪里:

有一个维护会话和其他数据的对象。此对象接受请求(如操作请求或订阅请求)并作为请求的结果或仅仅因为状态更改而推送事件。我想创建侦听特定事件或一组事件的对象,并对状态执行操作,所以我创建了这个合约:

例如,我想创建一个在服务器中创建实际会话的处理程序,并在会话准备好时回复连接通知。我创建一个代表请求的对象,另一个代表事件和它自己的处理程序。

现在出于测试目的,我创建了模拟场景的代码。基本上,它创建一个通信总线并订阅请求处理程序:

然后,模拟 Websocket 服务器,我编写从 WS 读取并将其发送到队列的部分:

现在应该从队列中听到事件并将它们转发到适当连接的部分:

但是最后一部分没有按预期工作。我在订阅中获得的对象不是我的原始事件,它是一个动态代理DynamicImpl.IConnectionEvent,所以我不能在 JSON 中序列化这个对象,因为它只包含IConnectionEvent.

如果我在订阅中指定类型,它可以工作:

但这意味着对于每个新事件,我必须触摸 websocket 服务器来注册该新类型。

有没有办法避免这种情况?