我正在做实时网络应用程序开发。
浏览器用户应该能够通过 node.js 服务器相互通信。其中一个用户写了一条消息,所有其他用户都会收到它。
我不太明白 RabbitMQ 是如何工作的。但从快速阅读看来,它处理消息的发布/订阅。
用户(在浏览器中)发布某些内容,订阅者(在其他浏览器中)获取该消息。这不是 Socket.io 对 websockets 所做的吗?
以下是我的问题:
它们各自的优点/缺点是什么? Socket.io 可以替代 RabbitMQ 吗?对于 Socket.io 不够用的 Web 应用程序,我是否需要 RabbitMQ?
更新
对于 Socket.io 不够用的 Web 应用程序,我是否需要 RabbitMQ?浏览器用户应该能够通过 node.js 服务器相互通信。其中一个用户写了一条消息,所有其他用户都会收到它。
如果您只有这些简单的要求,那么仅使用 socket.io 就足够了。。当您想以受控方式离线处理(繁重的)作业时,您只需要一条消息 queue。
http://en.wikipedia.org/wiki/Message_queue:
消息队列提供异步通信协议,这意味着消息的发送者和接收者不需要同时与消息队列交互。
这句话需要下沉。生产者(一个进程)将作业放入队列,消费者通过从队列中取出作业进行消费。大多数时候,消费者是同时消费多个作业的多个进程。消费者无法相互分辨他们正在从事什么工作。
这使得队列成为先进先出 (FIFO) 数据结构。
这是我认为队列的一个重要属性。先进先出属性虽然使用像 beanstalkd 这样的高级消息队列,但您可以指定作业优先级。
我希望这有任何意义;)
我正在做实时网络应用程序开发。
你能解释得更好一点,以便我们给你一个更好的答案吗?
我不太明白 RabbitMQ 是如何工作的。但从快速阅读看来,它处理消息的发布/订阅。
请参阅下面有关消息队列的报价。让它沉入一段时间。您还可以阅读有关 message queues 的 WIKI。
用户(在浏览器中)发布某些内容,订阅者(在其他浏览器中)获取该消息。这不是 Socket.io 对 websockets 所做的吗?
Socket.io 支持许多不同的传输(也包括 websockets),因为大多数浏览器不支持 websockets。但例如 Google Chrome 确实已经支持 websockets。我相信 websockets 是未来的传输(但还不是!)。当您查看 Socket.io's browser support page 时,您会注意到 Socket.io 确实支持所有主流浏览器(有些甚至是古老的)。好消息是它围绕一个很好的 API 进行了包装。
它们各自的优点/缺点是什么?
您正在将苹果与橙子进行比较,所以比较这有点奇怪。
兔MQ
http://www.rabbitmq.com/tutorials/tutorial-one-python.html:
RabbitMQ 是一个消息代理。主要思想非常简单:它接受和转发消息。您可以将其视为邮局:当您将邮件发送到邮箱时,您很确定邮递员先生最终会将邮件递送给您的收件人。使用这个比喻 RabbitMQ 是一个邮箱、一个邮局和一个邮递员。
优点
这是一个非常好的消息队列。我个人会使用 redis 或 beanstalkd。
缺点:
并不是真正的“浏览器”。
套接字.io
Socket.IO 旨在使每个浏览器和移动设备中的实时应用程序成为可能,从而模糊不同传输机制之间的差异。
优点
它适用于浏览器
缺点
它不是消息队列。
Socket.io 可以替代 RabbitMQ 吗?
不,你不能,因为它们是两个完全不同的东西。您正在将苹果与橙子进行比较。您应该尝试从我引用的网站中理解这两种描述。
RabbitMQ 是一种非常灵活的创建网络拓扑的方法。它是成熟的、受支持的,并且来自金融领域(在金融领域,他们长期以来一直在做消息传递)。我使用 RabbitMQ 服务器端,并使用其他协议通过“网关”连接到 RabbitMQ。
在幕后,RabbitMQ 是用一种称为 Erlang 的超简洁的函数式语言编写的。这本身没什么大不了的,但争论是,如果你知道自己在做什么,并且可以用更少的代码行来表达,那么它最终会更加可靠和可测试。
顺便说一句:Erlang 被 Facebook 和 Twitter 用于他们的幕后工作。
现在,RabbitMQ 不仅仅是一个网络套接字类型的东西......它基于“保证交付”。该功能对于企业情况很重要。 RabbitMQ,或者可以用于扩展......实际上,还有更多......我不公平。
我无法对 node.js 发表评论,因为我还没有机会使用它。我对 RabbitMQ 很满意。
回复:socket.io(我们在谈论 websockets 吗?)——如果这是针对浏览器的(正如上面的帖子所建议的那样),您可能会将其桥接到 RabbitMQ。即RabbitMQ 就是那么灵活。
RabbitMQ 被用作跨应用程序传递消息的方式,不一定是浏览器中的用户。然后,您可以在 node.js 中实现一个 RabbitMQ 客户端,例如将接收到的消息推送到浏览器。
有关示例,请参见 http://www.rabbitmq.com/blog/2010/11/12/rabbitmq-nodejs-rabbitjs/。