【问题标题】:difference between using rabbitmq vs multi threading使用rabbitmq与多线程之间的区别
【发布时间】:2014-06-04 01:25:37
【问题描述】:
如果我错了,请纠正我,但是,
我在 Ruby 中开发了一段时间,其中一个最明显的缺点是缺少多线程。
最近我一直在探索 node js,尤其是它的非阻塞 IO“特性”。
我的问题是:
- 当您可以使用像 node js 这样的多线程语言,您可以并行触发 1000 个请求并且它们都同时完成时,为什么要使用单线程语言并使用rabbitmq 来实现异步?
- node js与其他多线程语言相比有什么创新吗?我想我真正要问的是:node js非阻塞IO和多线程之间有区别吗?
【问题讨论】:
标签:
multithreading
node.js
architecture
rabbitmq
【解决方案1】:
nodeJS 不是多线程的。它是单线程,但 IO 发生在该单线程之外。一种流行语:“除了你的代码,一切都是并行的”。
所以节点很简单 - 只有一个线程。一次只执行一行代码。但是,IO 操作(从磁盘读取等)确实是“非阻塞”的,因此您的代码在 IO 操作发生时继续运行。当 IO 结束时,执行您提供的 IO 操作的回调。
明确回答您的问题:
-
使用 Node,您的 1000 个请求将无法准确处理
同时——但 IO 部分可能(操作系统会这样做,
在您的代码之外)。在您的实际应用程序中运行的部分
仍将是非常连续的,但退货顺序将取决于
关于完成 IO 的顺序,这不在你的手中。
更重要的是,如果您使用消息传递方案来执行异步
操作(完成请求后)您执行后台
任务在一个单独的过程中,而不是你的主要“倾听”过程。
因此,如果“后台”进程崩溃,您的监听进程是
还活着。
如上所述 - 节点有一个非阻塞线程。在一个
多线程语言,您的 代码 将是并行的(因此您
可能必须处理线程安全等令人兴奋的事情),但每个
请求将阻塞,直到它执行的任何 IO 完成。