MQ(RabbitMQ、ActiveMQ...)和网络库(ACE、Asio、libevent...)有什么区别?

What's the difference between MQ(RabbitMQ,ActiveMQ...) and network library(ACE, Asio, libevent...)?

目前,我们计划升级我们的产品以使用MQ(RabbitMQ 或ActiveMQ)在服务器和客户端之间进行消息传输。现在我们正在使用网络库 (evpp) 来这样做。

因为我以前没有用过MQ,所以对MQ的很多新特性很感兴趣,搞不清楚它们之间的本质区别,也不知道到底什么时候什么地方应该用MQ或者直接使用网络库也可以。

而我们使用MQ的目的是为了解决通信不可靠的问题,比如消息丢失或者网络环境不稳定导致的其他问题。

希望有熟悉两者的朋友解惑。感谢提前。

与任何网络编程一样,当客户端向服务器发送请求时,服务器会响应。但要做到这一点,必须满足以下条件

  1. 服务器必须正常运行并且运行
  2. 客户端应该能够在它们之间建立某种连接
  3. 当服务器向客户端发送响应时,连接不应中断,反之亦然

但是在消息队列的情况下,无论服务器想告诉客户端什么,消息都放在消息队列中,即单独 server/instance。客户端监听消息队列并处理消息。在来自客户端的肯定确认后,消息将从消息队列中删除。显然,服务器必须建立连接才能将消息推送到消息队列实例。即使客户端宕机,消息也会留在队列中。

消息队列系统(MQ、Qpid、RabbitMQ、Kafka 等)是专为可靠、灵活地处理消息而构建的高层系统。

网络编程libraries/frameworks(ACE、asio 等)是构建消息队列(以及许多其他类型的)系统的有用工具。

请注意,在 ACE 的情况下,它不仅仅包含网络,您可以使用上述消息队列系统,并使用同样使用 ACE 类 进行线程管理的程序来驱动它, OS 抽象、事件处理等