- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我们将在几周后启动一个新的 Spring 4 应用程序。我们想使用一些事件驱动的架构。今年我到处读到关于“Reactor”的文章,在网上寻找它时,我偶然发现了“Akka”。
所以现在我们有 3 个选择:
ApplicationEvent
:http://docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/org/springframework/context/ApplicationEvent.html react 堆
:https://github.com/reactor/reactor#reactor Akka
:http://akka.io/ 我找不到真正的比较。
现在我们只需要这样的东西:
X
注册监听 Event E
Y
注册监听 Event E
Z
发送 Event E
然后X
和Y
将接收并处理该事件。
我们很可能会以异步方式使用它,但肯定也会有一些同步场景。我们很可能总是发送一个类作为事件。 (Reactor 示例主要使用字符串和字符串模式,但它也支持对象)。
据我了解,ApplicationEvent
默认同步工作,Reactor
工作异步。 Reactor
还允许使用 await()
方法使其有点同步。 Akka
提供或多或少与 Reactor
相同的功能,但也支持 Remoting。
关于Reactor的await()
方法:可以等待多个线程完成吗?或者甚至可能是这些线程的一部分?如果我们以上面的例子为例:
X
注册监听 Event E
Y
注册监听 Event E
Z
发送 Event E
是否可以通过说:WAITINGX
和 Y
完成。是否有可能让它只等待X
,而不等待Y
?
也许还有一些替代品?例如 JMS 呢?
很多问题,但希望您能提供一些答案!
谢谢!
当某个特定事件被触发时,我想创建 10000 封电子邮件。每封电子邮件都必须使用用户特定的内容生成。所以我会创建很多线程(max = system cpu cores)来创建邮件并且不会阻塞调用者线程,因为这可能需要几分钟。
当特定事件被触发时,我想从未知数量的服务中收集信息。每次获取大约需要 100 毫秒。在这里我可以想象使用 Reactor 的 await
,因为我需要这些信息来继续我在主线程中的工作。
当特定事件被触发时,我想根据应用程序配置执行一些操作。因此应用程序必须能够动态(取消)注册消费者/事件处理程序。他们会用事件做他们自己的事情,我不在乎。所以我会为每个处理程序创建一个线程,然后继续在主线程中工作。
简单的解耦:我基本上知道所有的接收者,但我只是不想在我的代码中调用每个接收者。这应该主要是同步完成的。
听起来我需要一个 ThreadPool 或一个 RingBuffer。这些框架是否有动态的 RingBuffers,如果需要,它的大小会增加?
最佳答案
我不确定我能否在这个狭小的空间内充分回答您的问题。但我会试一试! :)
Spring 的 ApplicationEvent
系统和 Reactor 就功能而言确实截然不同。 ApplicationEvent
路由基于ApplicationListener
处理的类型。任何比这更复杂的事情,您都必须自己实现逻辑(但这不一定是坏事)。然而,Reactor 提供了一个全面的路由层,它也非常轻量级且完全可扩展。两者在功能上的任何相似之处都在于它们订阅和发布事件的能力,这实际上是任何事件驱动系统的特性。另外不要忘记 Spring 4 中的新 spring-messaging
模块。它是 Spring Integration 中可用工具的子集,还提供了围绕事件驱动架构构建的抽象。
Reactor 将帮助您解决几个关键问题,否则您必须自己管理:
Selector 匹配:Reactor 进行 Selector
匹配,它包含一系列匹配——来自一个简单的 .equals(Object other)
调用, 到允许占位符提取的更复杂的 URI 模板匹配。您还可以使用自己的自定义逻辑扩展内置选择器,这样您就可以使用丰富的对象作为通知键(例如域对象)。
Stream 和 Promise APIs:您提到 Promise
API 已经引用了 .await()
方法,它实际上是用于期望阻塞行为的现有代码。在使用 Reactor 编写新代码时,使用组合和回调来通过不阻塞线程来有效利用系统资源的压力不会太大。在依赖少量线程来执行大量任务的架构中,阻塞调用者几乎从来都不是一个好主意。 Futures 根本不是云可扩展的,这就是现代应用程序利用替代解决方案的原因。
您的应用程序可以使用 Streams 或 Promises 中的任何一种来构建,但老实说,我认为您会发现 Stream
更加灵活。关键的好处是 API 的可组合性,它允许您在依赖链中将操作连接在一起而不会阻塞。作为一个基于您描述的电子邮件用例的完全即兴示例:
@Autowired
Environment env;
@Autowired
SmtpClient client;
// Using a ThreadPoolDispatcher
Deferred<DomainObject, Stream<DomainObject>> input = Streams.defer(env, THREAD_POOL);
input.compose()
.map(new Function<DomainObject, EmailTemplate>() {
public EmailTemplate apply(DomainObject in) {
// generate the email
return new EmailTemplate(in);
}
})
.consume(new Consumer<EmailTemplate>() {
public void accept(EmailTemplate email) {
// send the email
client.send(email);
}
});
// Publish input into Deferred
DomainObject obj = reader.readNext();
if(null != obj) {
input.accept(obj);
}
Reactor 还提供 Boundary这基本上是一个 CountDownLatch
用于阻止任意消费者(因此,如果您只想阻止 Consumer<,则不必构造
完成)。在这种情况下,您可以使用原始 Promise
/Reactor
并使用 on()
和 notify()
方法来触发服务状态检查。
但是,对于某些事情,您想要的是从 ExecutorService
返回的 Future
,不是吗?为什么不把事情简单化?只有在吞吐量性能和开销效率很重要的情况下,Reactor 才会真正受益。如果您阻塞了调用线程,那么您很可能会抹去 Reactor 无论如何都会给您带来的效率提升,因此在这种情况下使用更传统的工具集可能会更好。
Reactor 的开放性的好处在于,没有什么可以阻止两者的交互。您可以自由地将 Futures
与 Consumers
混合使用,无需静态。在这种情况下,请记住,您的速度只会与最慢的组件一样快。
关于multithreading - 在 Spring 中使用什么样的 "EventBus"?内置、Reactor、Akka?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20663988/
我正在尝试使用 Scala 2.12.3、sbt 0.13.6 以及 build.sbt 文件中的以下库依赖项构建一个项目: libraryDependencies ++= Seq( "com.t
我根本没有任何 Akka 经验。我想知道 Akka 消息传递如何在 JVM 内以及 JVM 之间工作。 JVM 中的消息是一些类似 POJO 的对象吗? JVM之间的通信是否需要任何类型的JMS(如服
Akka的EventBus是否可以与远程 Actor 一起使用? 据我所知,它本身不支持此功能。任何人都可以确认吗? 看起来有可能对提供相似功能的Actor进行编码。例如。在订阅远程服务器上的Even
我在单个 JVM 上使用 Akka 开发了我的应用程序。现在我想在多台机器上分配工作负载。我开始阅读文档并感到困惑。 有两种方法可以通过集群和远程处理使 Akka 应用程序分发。 我不明白两者之间的区
我想使用 Akka HTTP 构建一个连接到现有接收器(带有 Kafka react 流)的 REST 服务,但我不知道如何将 HTTP 流链接到 Akka 流接收器... 我应该选择使用 Flows
我在某处听说默认情况下是一个 Actor 系统,这意味着它的 ExecutorService/Dispatcher 正在创建一个非 Deamon 线程池来运行 Actor。如果确实如此,那将解释我所经
在我的应用程序中,我有一个角色需要在等待某些操作完成时存储消息,同时它需要支持高优先级消息(控制消息)。 stash trait 需要一个 Dequeue邮箱类型,我找不到控制感知出队邮箱是否有意义。
Akka.NET 和原始 Akka 可以使用 Remoting 进行通信吗? 换句话说,Akka 可以用于连接系统中的 JVM 和 CLR 吗? 最佳答案 这个问题在 akka.net Github
Akka 新手。创建一个扩展 SupervisorStrategy 的新 Scala 类为我提供了以下模板: class MySupervisorStrategy extends Supervisor
我正在尝试为包含并行处理流的 Akka 流定义一个图(我正在使用 Akka.NET,但这应该无关紧要)。想象一个订单的数据源,每个订单由一个订单 ID 和一个产品列表(订单商品)组成。工作流程如下:
我有一个 akka actor(worker)接收请求并回复它。请求处理可能需要 3-60 分钟。来电者(也是 Actor )目前正在使用 !!!并等待 future.get,但是如果需要,可以更改
我应该如何在 Akka 持久化 (Eventsourcing/CQRS) 中构建我的 Actor? 分层 平行 我的电子商务应用程序中有这些域对象 用户 - 用户可以创建帐户 商店 - 用户可以创建商
我正在尝试构建和运行一个 akka 流(在 Java DSL 中),以 2 个 actor 作为源,然后是一个合并结点,然后是 1 个接收器: Source src1 = Source.act
我正在尝试监督 Akka Actor ,更具体地说是 Cluster Singleton创建使用 ClusterSingletonManager .我试图更好地控制异常、日志和 Actor 的生命周期
我试图了解何时何地使用不同的 built-in Akka mailboxes以及何时适合自己滚动。但是,该页面上的任何地方都没有解释“ 有界邮箱 ”实际上是什么,或者它的行为方式与无界邮箱有何不同。此
在Akka中等待多个actor的结果的正确方法是什么? Principles of Reactive Programming Coursera 类(class)有一个带有复制键值存储的练习。无需深入研
我正在为一个项目评估 Akka,我正在尝试弄清楚我是否可以通过将参与者状态保存在高可用数据存储中来使用 Akka-Persistence 实现服务的高可用性。 (我不打算使用 Akka-Cluster
我阅读了 Akka 文档并找到了这个 As mentioned before, if a node is unreachable then gossip convergence is not poss
我正在使用 akka 流,并且我有一段我需要有条件地跳过的图表,因为流程无法处理某些值。具体来说,我有一个接受字符串并发出 http 请求的流,但是当字符串为空时,服务器无法处理这种情况。但我只需要返
我们正在考虑使用 Akka 进行客户端服务器通信,并尝试对数据传输进行基准测试。目前我们正在尝试发送一百万条消息,其中每条消息都是一个具有 8 个字符串字段的案例类。 目前,我们正在努力获得可接受的性
我是一名优秀的程序员,十分优秀!