响应式编程和消息队列的区别

Differences between Reactive Programming and Message Queue

我最近忙于 Reactive 概念。我理解了两个独立的概念,即 Reactive SystemReactive Programming。另外,我知道 Reactive System 是一个更大的概念,包含四个属性:

  1. 响应
  2. 有弹性
  3. 可扩展
  4. 事件驱动

图片参考:medium.com

我的问题是关于响应式编程,我了解到它的目标是Observable/Subscriber模型的异步编程。

图片参考:https://hub.packtpub.com/introduction-reactive-programming/

现在我对 Reactive ProgrammingMessage Queue 之间的区别感到困惑。我在面向消息的中间件和相关标准如JMS方面有一些经验,我认为反应式编程在侦听器模式而不是阻塞模式下使用消息队列是一样的。

我想搞清楚响应式编程真正的概念。

在同步编程中,blocking queues被广泛使用。如果消费者未能及时处理消息,blocking queue 暂停生产者线程以避免消息过度消耗内存。

在同步世界中,必须避免线程阻塞,因此 blocking queues 是不可接受的。相反,使用 reactive streams 来通知生产者允许发送多少条消息。

从技术上讲,reactive stream 是一个普通的消息流加上 permissions 的反向流。 Permissions就像无法区分的消息,不需要存储,只需要统计。在同步世界中,permissionsjava.lang.Semaphorejava.lang.CountdownLatch 存储(计数)。不幸的是,大多数异步库不为开发人员提供单独的构造来处理 permissions。我知道的唯一例外是我自己的图书馆 df4j(可以在 Github 找到)。

除了异步信号量的(隐式)概念,我在所有 reactive programming 炒作中找不到任何其他意义。

响应式编程是旧概念的新名称。这意味着更喜欢事件驱动计算而不是请求-回复计算。或者 'push' 与 'pull'。因此,与其编写等待某事到达的代码,不如定义在某事发生时执行的回调。 观察者模式 是反应式编程的一个很好的例子,好莱坞原则 ("Don't call us, we'll call you").

也是如此。

在 JMS 术语中,如果您在消费者上定义了 MessageListener,那么您就是在进行响应式编程:MessageConsumer.setMessageListener(MessageListener listener)

然后您的 API 或其他代码可以决定同时处理什么,如果有东西从队列或主题到达,则调用该回调。

使用 MessageConsumer.receive(long timeout) 的替代方法不是响应式编程。在下一条消息到达之前,您正在阻塞当前线程。

以事件驱动或反应方式思考有时需要一点飞跃,但值得付出努力。

在审视系统本身时,我认为使用主题构建的基础设施是一个反应式系统。用队列构建的基础设施不是。