【问题标题】:RabbitMQ vs Socket.io?RabbitMQ vs Socket.io?
【发布时间】:2011-10-01 22:44:54
【问题描述】:

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

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

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

用户(在浏览器中)发布某些内容,而订阅者(在其他浏览器中)收到该消息。这不就是 Socket.io 对 websocket 所做的吗?

这是我的问题:

  1. 它们各自的优点/缺点是什么?
  2. Socket.io 可以替代 RabbitMQ 吗?
  3. 是否存在我需要 RabbitMQ 用于 Socket.io 无法满足的 Web 应用程序的场景?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 但是如果我只做web应用,这是否意味着我只能使用socket.io呢?这会做 RabbitMQ 已经在做的事情吗?
    【解决方案2】:

    更新

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

    如果您只有这些简单的要求,那么仅使用 socket.io 就足够了。。当您想以受控方式离线处理(繁重的)工作时,您只需要一条消息queue

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

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

    这句话需要下沉。生产者(一个进程)将作业放入队列,消费者通过从队列中取出作业进行消费。大多数时候,消费者是同时消费多个作业的多个进程。消费者无法相互分辨,他们正在从事什么工作。

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

    这是我认为队列的一个重要属性。先进先出属性虽然使用像 beanstalkd 这样的高级消息队列,但您可以指定作业优先级。

    我希望这有任何意义;)


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

    您能否解释得更好一点,以便我们给您更好的答案?

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

    请参阅下面有关消息队列的报价。让它沉入一段时间。你也可以阅读关于message queues的WIKI。

    用户(在浏览器中)发布 某事和订阅者(​​在其他 浏览器)收到该消息。不是这样吗 Socket.io 在做什么 网络套接字?

    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 是一个消息代理。这 主要思想很简单:它 接受和转发消息。你可以 把它想象成一个邮局:什么时候 您将邮件发送到您所在的邮箱 很确定邮差先生会 最终将邮件发送到您的 接受者。使用这个比喻 RabbitMQ 是一个邮箱,一个邮局 还有一个邮递员。

    优势

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

    缺点:

    • 不适合“浏览器”。

    Socket.io

    http://socket.io/:

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

    优势

    • 用于浏览器

    缺点

    • 它不是消息队列。

    Socket.io 可以替代 RabbitMQ 吗?

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

    【讨论】:

    • 我更新了我的问题,解释了我想做什么。还添加了第三个问题。我想我的问题是我真的需要 RabbitMQ 用于 Web 应用程序。有什么 RabbitMQ 可以做,而我无法使用准系统 socket.io 甚至 couchdb(_changed 事件)来完成吗?
    • 现在对我来说真的很有意义。 Socket.io 是一个邮局,参与者必须在那里。 RabbitMQ 是一个更先进的邮局,最终交付并遵循 FIFO。前者仅适用于网络,后者并非特定于网络。感谢您的详尽解释!
    • 哈哈好比喻。但是要清楚消息队列,它会被传递到第一个可以读取邮件/消息的房子(准备好处理工作),而使用 Socket.io,它会被传递到正确的房子。我还注意到rabbitMQ是一个非常先进的消息队列,例如pubsub、rpc、主题、路由(至少看起来很快)。
    • 消息队列是 RabbitMQ 的构建块。 RabbitMQ 使用队列来实现其他模式,包括“正确的房子”(这被称为交换——类似于邮局交换)。
    • 服务器到服务器的连接速度怎么样,RabbitMQ的协议比Socker.IO快吗?
    【解决方案3】:

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

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

    顺便说一句:Erlang 被 Facebook 和 Twitter 用于他们的幕后工作。

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

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

    re: socket.io(我们是在谈论 websockets 吗?)——如果这是针对浏览器的(正如上面的帖子所建议的那样),您可能会将其桥接到 RabbitMQ。也就是说,RabbitMQ 就是这么灵活。

    【讨论】:

      猜你喜欢
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 2012-10-01
      • 2015-08-12
      • 2017-12-23
      • 2018-04-02
      相关资源
      最近更新 更多