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

11
我最近忙于学习“反应式”概念。我理解了两个不同的概念,即“反应式系统”和“反应式编程”。此外,我知道“反应式系统”是一个更大的概念,包含四个属性:
  1. 响应式
  2. 弹性
  3. 可扩展
  4. 事件驱动

enter image description here

图片来源:medium.com

我的问题与响应式编程有关,我理解它的目标是通过Observable/Subscriber模型实现异步编程。 在此输入图像描述

图片来源:https://hub.packtpub.com/introduction-reactive-programming/

现在我对响应式编程消息队列之间的区别感到困惑。我在面向消息的中间件和相关标准(如JMS)方面有一些经验,我认为响应式编程使用消息队列处于监听器模式而非阻塞模式。

我希望清楚地了解响应式编程的真正概念。


在异步模型中,消息队列是一种中间件,它可以方便地发布消息并订阅这些消息。同样,一个队列将是实现反应式编程的生态系统的组成部分。 - S.K.
2个回答

18

响应式编程是对旧概念的新称呼。它意味着优先选择事件驱动的计算方式而非请求-响应的计算方式。或者说是'推'与'拉'的区别。因此,您不需要编写等待某些内容到达的代码,而是定义回调函数,在发生某些事情时执行回调。"观察者模式"是响应式编程的一个很好的例子, "好莱坞原则"("别打电话给我们,我们会打电话给你")也是如此。

在JMS术语中,如果您为消费者定义了MessageListener:MessageConsumer.setMessageListener(MessageListener listener),则表示您正在进行响应式编程。

然后您的API或其他代码可以决定在此期间处理什么,如果有消息从队列或主题到达,则调用该回调。

另一种使用MessageConsumer.receive(long timeout)的方法不是响应式编程。这将阻塞当前线程,直到下一条消息到达。

有时候以事件驱动或反应式的方式思考需要一点跳跃,但这是值得努力的。

当查看系统本身时,我认为使用主题构建的基础设施是一个反应式系统。而使用队列构建的基础设施则不是。


1
在同步编程中,广泛使用阻塞队列。如果消费者无法及时处理消息,则阻塞队列会暂停生产者线程以避免过度消耗消息的内存。
在同步世界中,必须避免线程阻塞,因此不接受阻塞队列。相反,使用反应式流,它通知生产者可以发送多少条消息。
技术上,反应式流是一条常规消息流加上反向的许可流许可就像不可区分的消息,不需要存储,只需要计数。在同步世界中,许可java.lang.Semaphorejava.lang.CountdownLatch存储(计数)。不幸的是,大多数异步库不提供开发人员处理许可的单独构造。我所知道的唯一例外是我的库df4j(可以在Github上找到)。
除了(隐含的)异步信号量概念之外,我在所有反应式编程炒作中没有找到其他意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接