RabbitMQ vs Socket.io?

时间:2011-07-09 17:08:37

标签: node.js websocket rabbitmq amqp socket.io

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

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

我不太了解RabbitMQ的工作原理。但是从快速阅读来看,它似乎处理消息的发布/订阅。

用户(在浏览器中)发布内容,订阅者(在其他浏览器中)获取该消息。这不是Socket.io用websockets做的吗?

以下是我的问题:

  1. 每个人的优点/缺点是什么?
  2. 可以将Socket.io替换为RabbitMQ吗?
  3. 我是否需要RabbitMQ用于Socket.io不足的网络应用程序?

3 个答案:

答案 0 :(得分:60)

更新

  

是否有我需要RabbitMQ的场景   对于Socket.io没有的Web应用程序   满足?   浏览器用户应该能够通过node.js服务器相互通信。一   用户写入消息,所有其他用户都会收到消息。

当你只有socket.io这些简单的要求就足够了。。当您想要离线并以受控方式处理作业(重)时,您只需要一条消息queue

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

  

消息队列提供异步   通信协议,意思是   消息的发送者和接收者   不需要与之互动   消息队列同时出现。

这句话需要深入。生产者(一个进程)将一个作业放入队列,消费者通过从队列中取出作业来消耗。大多数情况下,消费者是同时消耗多个作业的多个进程。消费者无法彼此分辨他们正在消费的工作。

  

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

这是我认为队列的一个重要属性。 First-In-First-Out属性虽然具有像beansstalkd这样的高级消息队列,但您可以优先考虑作业。

我希望这根本没有任何意义;)


  

我正在做实时网络应用   发展。

你能解释一下,以便我们能给你一个更好的答案吗?

  

我不太了解RabbitMQ的工作原理。   但是从快速阅读中可以看出来   它处理出版/订阅   消息。

请参阅下面有关消息队列的引用。让它陷入一段时间。您还可以阅读关于message queues的WIKI。

  

用户(在浏览器中)发布   东西和订户(在其他方面   浏览器)获取该消息。不是那样的   Socket.io正在做什么   的WebSockets?

Socket.io支持许多不同的传输(也是websockets),因为大多数浏览器都不支持websockets。但是,例如Google Chrome已经支持websockets。我相信websockets是未来的传输(但还没有!)。当您查看Socket.io's browser support page时,您会注意到Socket.io确实支持所有主流浏览器(有些甚至是古老的浏览器)。好消息是它围绕一个很好的API包装。

  

有哪些优点/缺点   对于他们每个人?

您正在将苹果与橙子进行比较,因此比较它有点奇怪。


的RabbitMQ

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

  

RabbitMQ是一个消息代理。该   主要想法很简单:它   接受和转发消息。您可以   把它想象成一个邮局:什么时候   你发邮件到你的邮箱   很确定Postman先生会的   最终将邮件发送给您   接受者。用这个比喻   RabbitMQ是一个邮箱,一个邮局   和一个邮差。

优点

  • 这是一个非常好的消息队列。我个人会使用redisbeanstalkd

缺点:

  • 不是真的用于“浏览器”。

Socket.io

http://socket.io/

  

Socket.IO旨在制作实时应用   可以在每个浏览器和   移动设备,模糊了   不同之间的差异   运输机制。

优点

  • 适用于浏览器

缺点

  • 这不是消息队列。
  

Socket.io可以取代RabbitMQ吗?

不,你不能,因为他们是两个完全不同的东西。您正在将苹果与橙子进行比较。您应该尝试理解我引用的网站的两个描述。

答案 1 :(得分:5)

RabbitMQ是一种非常灵活的创建网络拓扑的方法。它是成熟的,受到支持的,来自金融领域(在金融领域,他们长期以来一直在做消息传递)。我使用RabbitMQ服务器端,并使用其他协议通过“网关”连接到RabbitMQ。

在幕后,RabbitMQ是用一种名为Erlang的超简洁功能语言编写的。这本身并没什么大不了的,但争论的焦点是,如果你知道自己在做什么,并且可以用较少的代码行说出来,那么它最终会更加可靠和可测试。

btw:Facebook和Twitter使用Erlang作为幕后的东西。

现在,RabbitMQ不仅仅是一个网络套接字类型的东西......它基于“保证交付”。该功能对于企业情况非常重要。 RabbitMQ,或者可以用来扩展...实际上,还有更多...我不是在做正义。

我无法评论node.js,因为我还没有机会玩它。我对RabbitMQ很满意。

re:socket.io(我们正在谈论websockets吗?) - 如果这是针对浏览器的(如上面的帖子所示),你可以将其连接到RabbitMQ。即RabbitMQ是灵活的。

答案 2 :(得分:3)

RabbitMQ用作跨应用程序传递消息的方式,不一定是浏览器中的用户。然后,您可以在node.js中实现RabbitMQ客户端,例如将收到的消息推送到浏览器。

有关示例,请参阅http://www.rabbitmq.com/blog/2010/11/12/rabbitmq-nodejs-rabbitjs/