RabbitMQ和Socket.io有何区别?

83

我正在进行实时网络应用程序开发。

浏览器用户应该通过 node.js 服务器相互通信。一个用户编写一条消息,所有其他用户都会收到它。

我不太明白 RabbitMQ 如何工作。但是从快速阅读中可以看出,它处理消息的发布/订阅。

一个用户(在浏览器中)发布一些内容,订阅者(在其他浏览器中)获取该消息。这不是 Socket.io 通过 WebSockets 在做的事情吗?

以下是我的问题:

  1. 每个工具的优缺点是什么?
  2. Socket.io 可以替代 RabbitMQ 吗?
  3. 有哪些场景需要 RabbitMQ 而 Socket.io 不足以满足需求?
2个回答

96

更新

在Web应用程序中,我是否需要RabbitMQ的一些场景,而Socket.io不能满足要求?浏览器用户应该能够通过node.js服务器相互通信。其中一个用户编写了一条消息,所有其他用户都将收到它。

当您只有这些简单要求时,仅使用socket.io就足够了。仅当您希望离线和受控方式处理作业(重型)时,才需要使用消息queue

http://en.wikipedia.org/wiki/Message_queue:

消息队列提供异步通信协议,这意味着消息的发送者和接收者不需要同时与消息队列交互。

这句话需要理解。生产者(一个进程)将作业放入队列中,消费者通过从队列中取出作业来消费。大多数情况下,消费者是同时消费多个作业的多个进程。消费者无法互相确定他们正在消费哪些作业。

这使得队列成为先进先出(FIFO)数据结构。

我认为这是队列的一个重要特性。虽然像beanstalkd这样的高级消息队列可以为作业设置优先级,但先进先出属性仍然存在。

希望这有任何意义;)


我正在进行实时的Web应用程序开发。

能否更详细地解释一下,以便我们可以给出更好的答案?

参见下面关于消息队列的引语。让它沉淀一段时间。您也可以阅读有关消息队列的WIKI。

一个用户(在浏览器中)发布了一些内容,订阅者(在其他浏览器中)接收到该消息。这不是Socket.io通过WebSockets所做的吗?

Socket.io支持许多不同的传输方式(包括WebSockets),这是必要的,因为大多数浏览器都不支持WebSockets。但例如Google Chrome已经支持WebSockets。我相信WebSockets是未来的传输方式(但现在还没有!)。当您查看Socket.io的浏览器支持页面时,您会注意到Socket.io支持所有主要浏览器(甚至一些古老的浏览器)。好处是它提供了一个很好的API。

它们各自的优缺点是什么?

你在比较苹果和橙子,这样比较有点奇怪。


RabbitMQ

http://www.rabbitmq.com/tutorials/tutorial-one-python.html:

RabbitMQ是一个消息代理。其主要思想非常简单:它接受并转发消息。你可以把它想象成邮局:当你将邮件投递到邮箱时,你相信邮递员先生最终会将邮件送到收件人手中。使用这个比喻,RabbitMQ就像是一个邮箱、邮局和邮递员。

优点

  • 它是一个相当不错的消息队列。个人而言,我会使用redisbeanstalkd

缺点:

  • 不太适合“浏览器”。

Socket.io

http://socket.io/:

Socket.IO旨在使实时应用程序在每个浏览器和移动设备中都成为可能,模糊了不同传输机制之间的差异。

优点

  • 适用于浏览器

缺点

  • 它不是消息队列。

Socket.io能取代RabbitMQ吗?

不可以,因为它们是完全不同的东西。你正在比较苹果和橙子。你应该尝试理解我引用的两个网站上的描述。


9
RabbitMQ是创建网络拓扑的一种非常灵活的方式。它是成熟、受支持的,并来自金融领域(在金融领域,他们已经做了很长时间的消息传递)。我在服务器端使用RabbitMQ,并使用其他协议通过“网关”连接到RabbitMQ。
在幕后,RabbitMQ是用一种超简洁的函数式语言Erlang编写的。这本身并不是什么大不了的事情,但有争议的是,如果你知道你在做什么,并且可以用更少的代码说出来,那么它最终会更可靠和可测试。
顺便说一下:Facebook和Twitter在幕后的工作中都使用Erlang。
现在,RabbitMQ不仅仅是一个网络套接字类型的东西……它基于“有保证的交付”。这个功能对企业环境非常重要。RabbitMQ也可以用于扩展……实际上,不止如此……我没有充分阐述它。
我不能评论node.js,因为我还没有机会尝试它。我对RabbitMQ感到满意。
关于socket.io(我们在谈论WebSockets吗?)-如果这是针对浏览器的(如上面的帖子所示),您可以将其潜在地桥接到RabbitMQ。也就是说,RabbitMQ是如此灵活。

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