2013-12-23 101 views
20

我对这些高级并发范例很陌生,我已经开始使用scala RX绑定。所以我想了解RX与RabbitMQ或ZeroMQ等消息队列的区别?RX与消息队列如rabbitmq或zeromq?

它们都似乎使用订阅/发布范例。在某处我看到关于RX在RabbitMQ上运行的推文。

有人可以解释RX和消息队列之间的区别吗?为什么我会选择一个呢?一个可以替代另一个,还是它们是互斥的?它们在哪些方面重叠?

+2

队列排队做。 Rx没有。 Rx未分配。 Rx是事件处理范例,而不仅仅是pub/sub。活动是发布/订阅模式。 –

回答

21

值得点击[system.reactive]标签上的learn more链接,我们在那里放了一些信息!

从介绍那里你可以看到,RX是不是一个消息队列技术:

无功扩展器(Rx)是构成使用观察序列和LINQ风格的异步和基于事件的程序库查询运算符。 System.Reactive是通过库使用的根名称空间。使用Rx,开发人员使用LINQ操作符表示异步数据流,并使用Scheduler在异步数据流中对并发进行参数化。简单地说,Rx = Observables + LINQ + Schedulers。

所以,Rx和消息队列是真正独特的技术,可以很好地互补。一个经典的例子是股票价格代码服务 - 这可能通过消息队列传递,但是随后由Rx转换为组合,聚合和过滤价格。

你可以走得更远:多为实体框架变成IQueryable<T>查询到SQL直接运行在数据库上,你可以创建一个打开的Rx IQbservable<T>查询到本机查询供应商 - 例如Where过滤器可能利用所存在的天然过滤功能在很多消息队列技术中直接应用过滤器。尽管这是相当多的工作,并且很难。

将消息队列消息输入到Rx Subject中并不罕见,以便将来自队列的传入消息转换为Rx流以便在客户端轻松使用。 Rx还广泛用于GUI中,用于处理按钮按下和文本框更改等客户端事件,从而使通过异步服务器查询进行拖放式和文本自动完成等传统困难场景变得更加简单。有一个很好的手实验室覆盖后面的场景here。它是针对Rx的早期发布而写的,但仍然非常相关。

我推荐看看Bart de Smet的这个视频演示,里面有一个精彩的介绍:Curing Your Event Processing Blues with Reactive Extensions (Rx) - 包括经典的Rx演示,它通过Kinect的实况反馈写一个查询来解释挥手!

+0

好的答案!但是,您需要注意您对Reactive Extensions(Rx)的定义以及您所指的实现。例如,Javascript的Rx扩展不包含调度程序等。 – arcseldon

+0

请记住,'system.reactive'标记是原始的.NET版本,所以我假定在回答时。 –

+1

公平点,但我不太清楚OP是否要求.NET特定的答案。在问题中没有提及这一点。我的评论不是批评你的优秀答案,只是通过考虑其他实施观点来加强它。 – arcseldon

8

有人可以解释RX和这些其他消息队列之间的区别吗?

Rx仅仅是事件(任何事件!)的抽象。接收来自分布式队列的消息是事件,并且通常,ZeroMQ/RabbitMQ解决方案通常必须使用和组合不同的事件,这是Rx非常擅长的。

所以很多时候,的Rx使得编写ZeroMQ/RabbitMQ的应用程式多容易比起来,否则:)

+0

您的回答听起来不错 - 请您链接到Rx和RabbitMQ协作使用的示例 - 例如,您是否有Github回购演示等,其中Rx被用作兔子队列的消费者。或者您可以在您的答案中包含框架代码。 – arcseldon

+0

我*可以*指出几家这样做的投资银行,但我不想被起诉。 :)足以说我可以证实这是一种常见的情况。 –

相关问题