我们将在几周后开始一个新的 Spring 4 应用程序。我们想使用一些事件驱动的架构。今年我到处阅读有关“Reactor”的信息,在网上寻找它时,我偶然发现了“Akka”。
所以现在我们有3个选择:
- 春天的
ApplicationEvent
:http ://docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/org/springframework/context/ApplicationEvent.html Reactor
:https ://github.com/reactor/reactor#reactorAkka
:http ://akka.io/
我找不到真正的比较。
现在我们只需要类似的东西:
X
注册监听Event E
Y
注册监听Event E
Z
发送一个Event E
然后X
andY
将接收并处理该事件。
我们很可能会以异步方式使用它,但肯定会有一些同步场景。我们很可能总是发送一个类作为事件。(Reactor 示例主要使用字符串和字符串模式,但它也支持对象)。
据我了解,ApplicationEvent
默认情况下同步Reactor
工作并以异步方式工作。并且Reactor
还允许使用该await()
方法使其有点同步。Akka
提供或多或少的相同Reactor
,但也支持Remoting。
关于 Reactor 的await()
方法:它可以等待多个线程完成吗?或者甚至可能是这些线程的一部分?如果我们从上面举个例子:
X
注册监听Event E
Y
注册监听Event E
Z
发送一个Event E
X
是否可以通过说:等待并 Y
完成来使其同步。是否有可能让它只等待X
,而不是等待Y
?
也许还有一些替代品?例如 JMS 呢?
很多问题,但希望你能提供一些答案!
谢谢!
编辑:示例用例
当特定事件被触发时,我想创建 10000 封电子邮件。每封电子邮件都必须使用用户特定的内容生成。所以我会创建很多线程(max = system cpu cores)来创建邮件并且不会阻塞调用者线程,因为这可能需要几分钟。
当特定事件被触发时,我想从未知数量的服务中收集信息。每次获取大约需要 100 毫秒。在这里我可以想象使用 Reactor 的
await
,因为我需要这些信息来继续我在主线程中的工作。当特定事件被触发时,我想根据应用程序配置执行一些操作。因此应用程序必须能够动态(取消)注册消费者/事件处理程序。他们会用事件做他们自己的事情,我不在乎。所以我会为每个处理程序创建一个线程,然后继续在主线程中完成我的工作。
简单的解耦:我基本上知道所有的接收器,但我只是不想在我的代码中调用每个接收器。这应该主要是同步完成的。
听起来我需要一个 ThreadPool 或一个 RingBuffer。这些框架是否有动态的 RingBuffers,如果需要,它的大小会增加?