消息队列与负载均衡。我真的不太理解它们之间的区别。

帮助我理解一件事。我看过几个企业应用架构,注意到其中几个使用了消息队列服务,比如ActiveMQ或RabbitMQ。我对消息队列服务器的表面知识有所了解,但我真的不明白为什么要选择构建一个使用消息队列的应用基础架构,而不是选择标准的负载均衡技术,比如HAProxy之类的。

这两者之间的真正区别是什么?两者都似乎可以将流量和/或消息路由到订阅队列或池的节点。每种方法都有其优缺点吗?


5这些实际上彼此之间没有任何关系。 - Michael Hampton
2好的,那么有什么区别呢?使用MQ服务会得到什么,而使用负载均衡器又能实现什么MQ服务无法做到的呢? - Jason Clark
7不要误解我的意思,但是如果你不理解这两种技术的区别或者在哪里应用它们,你就没有资格评估它们作为解决方案。如果你试图根据它们的功能来决定使用哪个,那么你是以错误的方式来解决工程问题——你应该问的问题是我需要我的环境做X,哪种技术可以实现这一点?而不是我有一个可以做Y的技术,我在我的环境中可以在哪里/如何使用它? - voretaq7
6如果有一天我想要建房子,我想知道锤子和油漆刷之间的区别,以及何时应该使用它们。我现在并不打算建房子,只是想知道何时应该使用每种工具。对我来说,这听起来并不是一个不合理的问题。就好像你在说,在你了解什么是锤子和油漆刷之前,不要建房子,也不要问那些建房子的人。 - Jason Clark
2@JasonClark- 这个网站是为专业人士设计的,我们有合理的期望,说这些专业人士会在在此提问之前进行尽职调查。 - EEAA
@JasonClark 那听起来差不多对吧。你真的会走到一个建筑工地上去问锤子和油漆刷的区别吗? - rtf
@r.tanner.f 是的。就像我在课堂上作为学生向我的教师提问一样。如果我表达不清楚,而且我想知道,是的。我会毫无顾虑地这样做,而不用担心被嘲笑。 - Jason Clark
1其实,我非常确定走到一个建筑工地上,要求那里的人停下手头的工作,向一个连基本建筑知识都没有去了解就提问的路人解释锤子和油漆刷的区别,很可能会遭到嘲笑的回应。 - Jenny D
@JennyD 虽然那位建筑工人停下手头的工作来教一个渴望学习建造房屋的年轻学生,这种行为是值得赞赏的。感谢EEAA。 - Jason Clark
1这个问题更多是关于消息队列的好处以及如何识别何时何地使用消息队列。我对负载均衡有很好的理解,以及它对高可用应用程序的好处。我不清楚的是MQ服务器提供的明显好处。我认为EEAA现在已经回答了这个问题。没有必要继续在房屋建设方面进行挑衅。 - Jason Clark
1这件事处理得非常糟糕,@JasonClark受到了虐待。我代表一群工程师社区向他道歉,我们都对那些在我们之前来过并慷慨地与我们分享知识的人感激不尽,这是一笔无法偿还的债务。提问的人并没有被期望成为领域专家,只要回答问题的人是专家即可。他并没有走进一个工地并要求别人停止工作。好斗的路人看到了一个机会,虐待他们认为低人一等的人,因为这给他们带来了快乐。 - Bruno Bronosky
1个回答

根据迈克尔的说法,这两者在功能和能力上有很大的区别。 消息队列系统 消息队列服务的主要功能是允许应用程序的不同部分之间进行异步通信。消息队列服务器通常允许配置任意数量的路由规则、队列等,应用程序的某些部分发布消息到这些队列,而其他部分则订阅这些消息。 以视频转码应用程序为例,所需的基本功能包括: 1. 用户上传视频文件 2. 系统将视频转码为不同格式 3. 系统使转码后的视频可供下载 在完成第一步后,你真的希望用户的浏览器会话在转码过程中挂起45分钟吗?不,我想不会。因此,你可以将一个消息放入消息队列,告知需要进行工作。然后,应用程序的后端处理部分会接收到这个消息,执行转码操作,完成后向另一个队列发布一个“我完成了!”的消息,触发应用程序的第三部分给用户发送电子邮件,告知任务已完成。 除了将应用程序的不同部分分离开来,MQ系统还允许作业排队。假设您的硬件每30分钟只能处理一个视频,但在高峰期,用户上传的视频超过了这个数量。使用MQ可以使这些作业优雅地排队,并在后端有能力处理时按顺序处理。 负载均衡系统的主要功能是接收来自客户端的请求,并将这些请求分发给一个或多个后端应用服务器。 换句话说,消息队列服务专注于不同应用程序部分之间的异步通信,而负载均衡服务专注于客户端与一个或多个后端服务器池之间的同步通信。

好的,很酷。尽管我理解了你的解释,但我仍然不能清楚地确定何时使用 MQ 服务器。负载均衡对我来说是清楚的。我明白。但是,与不使用 MQ 的应用架构相比,我能够通过 MQ 服务器做些什么?是异步服务器间通信和 MQ 的先进先出消息传递功能在某种程度上使我受益吗? - Jason Clark
1@JasonClark - 我认为我回答中提到的使用案例已经很清楚了。 - EEAA
谢谢,现在明白多了。非常清晰的例子和解释。 - Jason Clark
@JasonClark - 绝大多数应用程序都需要某种形式的消息队列。因此,你要么自己构建排队机制,要么使用像Redis或RabbitMQ这样的预构建系统。 - EEAA
所以区别只是关于同步和异步吗? - Obaid Maroof
@JasonClark [a]synchronous是一个很大的概念,并不总是像转码视频那样极端。将MQ视为减少负载均衡后面所需服务器数量的一种方式。如果您的Web服务器可以处理100个并发请求,并且您使用一个需要5秒钟响应的外部API,那么您每秒只能处理20个请求(每个服务器)。如果将该API调用发送到MQ,并通过AJAX稍后收集结果,您可以在0.25秒内完成请求,从而每秒处理400个请求。您需要在负载均衡后面放置20个Web服务器才能满足原始方式的要求。 - Bruno Bronosky