什么是MQ,为什么我想要使用它?

51

在我的团队中,我们经常使用IBM MQ技术进行跨应用程序通信。最近我在Hacker News和其他地方看到了其他MQ技术,比如RabbitMQ。我基本了解它是什么(一个常被检查的区域,用于放置和获取消息),但我想知道它究竟能做些什么?我如何知道何时需要使用它?为什么不坚持使用更基础的进程间通信方式呢?

5个回答

85

到目前为止,所有的解释都很准确、简洁 - 但可能漏掉了一些内容:消息队列的主要优势之一是弹性。

想象一下:你需要与两个或三个其他系统通信。如今常见的方法是使用 Web 服务,如果你需要立即得到回答,这是可以的。

然而,Web 服务可能无法使用,不可用 - 那么你该怎么办呢?将你的消息放入消息队列(在你的机器/服务器上也有组件)通常会在这种情况下工作 - 你的消息现在没有被传递和处理 - 但当服务的另一端重新上线时,它将在以后被处理。

因此,在许多情况下,使用消息队列连接不同的系统是一种更可靠、更健壮的发送消息的方式。它并不适用于所有情况(如果你想了解 MSFT 的当前股价,把请求放入队列可能不是最好的选择) - 但在许多情况下,比如将订单放入供应商的消息队列中,它非常有效,并且可以帮助缓解其他技术的可靠性问题。


3
如果MQ服务器崩溃了,你该怎么办?它并不比Web服务更具弹性,对吧? - Rob Holmes
4
通常情况下,即使您无法将其发送到队列服务器,也可以将其加入到本地队列中 - 当队列服务器恢复时,它将被传输到该服务器,并且是更具弹性的,比一般的Web服务要好。 - marc_s
@marc_s,我们如何将消息加入到RabbitMQ的本地队列中?它是如何与MQ服务器上的队列同步的? - techspider
3
你如何衡量软件的弹性?为什么我们应该接受一个消息队列比一个Web服务更具有弹性? - leccionesonline

18

MQ代表消息队列。

它是一个抽象层,允许多个进程(可能在不同的机器上)通过各种模型(例如点对点、发布订阅等)进行通信。根据实现方式,它可以配置一些功能,例如保证可靠性、错误报告、安全性、发现性能等。

你可以使用套接字手动完成所有这些操作,但非常困难。

例如:假设您希望进程之间进行通信,但其中一个进程可能会在中途死亡并稍后重新连接。如何确保暂停期间的消息不会丢失?MQ解决方案可以为您完成此操作。


11

消息队列系统应该给你提供许多好处。其中最重要的是监视和事务行为。

如果你希望免疫故障,例如电源故障,则交易设计非常重要。想象一下,你想要通知银行系统提取ATM现金,并且必须在每个请求中恰好执行一次,无论哪些服务器在中间暂时失败。MQ系统将允许你协调多个数据库、MQ和其他系统之间的事务。

不用说,与命名管道、TCP或其他非事务工具相比,这样的系统非常慢。如果需要高性能,就不能让消息通过磁盘写入。相反,它会使你的设计变得复杂——为了实现异构可靠和快速的通信,这将把设计师推向真正非常规的技巧。

MQ系统通常允许用户观察队列内容、编写插件、清除队列等。


4

MQ简单地代表消息队列。

当您需要可靠地发送跨进程/跨平台/跨应用程序的消息且不受时间限制时,可以使用它。

消息队列接收消息,将其放置在正确的队列中,并等待应用程序在准备好时检索消息。


2
那么,听起来MQ是一种通常为了可靠性而牺牲性能的技术? - Harvey Lin

0
参考:Web服务可能会停机并且不可用 - 那么你该怎么办呢? 作为扩展,如果您的本地网络和本地PC也停机了怎么办?在等待系统恢复依赖部署在其他地方的系统时,需要查看备用数据流以查看该数据。否则,对于今天和不久的将来的物联网(IOT)要求来说,这可能不足以提供“实时”响应。
如果您想要真正的并行、非易失性存储各种FIFO流(至少在信号链的某个点上),请使用FPGA和FRAM存储器。FRAM以时钟速度运行,FPGA设备可以在飞行中重新编程,添加和删除所需的独立并行数据流(当然要在已建立的约束条件内)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接