RX 和 RabbitMQ 或 ZeroMQ 这样的消息队列相比有什么优劣之处?

29

我对这些高级并发范式还比较新,我开始使用scala RX绑定。所以我试图了解RX与RabbitMQ或ZeroMQ等消息队列的区别。

它们都似乎使用订阅/发布范例。在某个地方,我看到了一条关于RX在RabbitMQ之上运行的推文。

有人能解释一下RX和消息队列之间的区别吗?为什么我要选择一个而不是另一个?一个可以替代另一个,还是它们是互斥的?在哪些领域它们重叠?


2
队列做排队。Rx不做排队。 Rx不是分布式的。 Rx是事件处理范式,不仅仅是发布/订阅。事件是发布/订阅范式。 - Vadym Chekan
2个回答

29
值得点击 了解更多 关于 [system.reactive] 标签的信息,我们在那里提供了相当多的信息!
从介绍中可以看出,Rx 不是消息队列技术:

Reactive Extensions (Rx) 是一个使用可观测序列和类似于 LINQ 的查询操作符来组合异步和基于事件的程序的库。 System.Reactive 是整个库中使用的根命名空间。使用 Rx,开发人员使用 LINQ 运算符表示异步数据流,并使用调度器对异步数据流中的并发进行参数化。简而言之,Rx = Observables + LINQ + Schedulers。

所以,Rx 和消息队列确实是不同的技术,它们可以很好地互补。经典例子是股票价格标语服务 - 它可能通过消息队列传递,但然后通过 Rx 进行转换以分组、聚合和过滤价格。
你可以更进一步:就像 Entity Framework 将 IQueryable<T> 查询转换为直接在数据库上运行的 SQL 一样,你可以创建提供程序将 Rx IQbservable<T> 查询转换为本机查询 - 例如,一个 Where 过滤器可能利用现有于许多消息队列技术中的本机过滤能力来直接应用过滤器。不过,这是相当费力和困难的。
更容易做到的是,通常会看到将消息队列消息提供给 Rx Subject,以便将来自队列的传入消息转换为易于在客户端使用的 Rx 流。Rx 在 GUI 中也广泛用于处理客户端事件,例如按钮按下和文本框变化,从而使传统上困难的场景,如异步服务器查询通过拖放和文本自动完成等功能得到极大地简化。有一个很好的实践实验室,涵盖了后一种情况 这里。它是针对 Rx 的早期版本编写的,但仍然非常相关。
我建议看一下 Bart de Smet 的这个视频演示,它是一个很棒的入门介绍:用反应式扩展(Rx)解决事件处理问题 - 其中包括经典 Rx 演示,它可以编写一个查询来解释来自 Kinect 的实时视频流中的手势!

不错的回答!然而,你需要小心你对响应式扩展(Rx)的定义以及你所指的实现。例如,针对Javascript的Rx扩展并没有包含调度器等功能。 - arcseldon
1
有道理,但我不太清楚OP是否在寻求.NET特定的答案。问题中没有提到这一点。我的评论并不是为了批评你出色的回答,而是考虑其他实现角度来增强它。 - arcseldon
值得指出的是,很多人使用这个标签只是因为它比许多端口更受欢迎。 - James World
链接已经失效了,请您重新检查。谢谢。 - kuldeep
这是十年前的事了,@kuldeep! :) 不过令人惊讶的是,我还是找到了一个可用的演示视频链接给你,现在已经修复了。 - James World
显示剩余4条评论

13
有人能解释一下 RX 和其他消息队列之间的区别吗?
Rx 只是对事件(任何类型的事件!)的抽象。从分布式队列中接收消息就是一个事件,而且通常,ZeroMQ/RabbitMQ 解决方案经常需要使用和组合不同的事件,这正是 Rx 所擅长的。
因此,Rx 让编写 ZeroMQ/RabbitMQ 应用程序比以往更容易 :)

你的回答听起来不错 - 请问你能否提供一些使用 Rx 和 RabbitMQ 协同工作的示例链接 - 比如你是否有 Github 仓库演示等,其中 Rx 被用作 Rabbit 队列的消费者等。或者你能否在回答中包含骨架代码。 - arcseldon
可以列举几家这样做的投资银行,但我不想被起诉。 :) 简而言之,我可以确认这是一个常见的情况。 - James World

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