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

时间:2018-08-16 06:31:58

标签: java queue jms reactive-programming

这些天,我忙于反应性概念。我已经理解了两个独立的概念,分别是反应式系统反应式编程。另外,我知道反应系统​​是一个较大的概念,其中包含四个属性:

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

enter image description here

图片参考:medium.com

我的问题与反应式编程有关,我知道它的目标是通过Observable / Subscriber模型进行异步编程。 enter image description here

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

现在,我对响应式编程消息队列之间的区别感到困惑。我在面向消息的中间件和相关标准(例如 JMS )上有一些经验,并且我认为响应式编程在侦听器模式下使用消息队列是相同的不阻止模式。

我想清楚地了解反应式编程的真实概念。

2 个答案:

答案 0 :(得分:5)

反应式编程是旧概念的新名称。这意味着与请求-响应计算相比,更喜欢事件驱动的计算。或“推”与“拉”。因此,您可以定义在发生某些情况时执行的回调,而不是编写等待某些情况到达的代码。 观察者模式是反应式编程的一个很好的例子,好莱坞原则(“不要叫我们,我们会叫你”)也是如此。

按照JMS的术语,如果您在使用者上定义了MessageListener,则您正在执行反应式编程:MessageConsumer.setMessageListener(MessageListener listener)

然后,您的API或其他代码可以决定在此期间要处理什么,以及是否从队列或主题到达某些内容,则调用该回调。

使用MessageConsumer.receive(long timeout)的替代方法不是反应式编程。您正在阻止当前线程,直到收到下一条消息为止。

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

在查看系统本身时,我认为以主题构建的基础架构是反应系统​​。没有使用队列构建的基础结构。

答案 1 :(得分:0)

在同步编程中,blocking queues被广泛使用。如果使用者无法及时处理消息,则blocking queue会挂起生产者线程,以避免过多消耗消息的内存。

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

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

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