消息队列与套接字的区别

50

我没有太多的套接字编程经验,但我尝试了解了一些相关知识。我比较熟悉 MDB 和消息队列。有人告诉我队列(例如 MDB)与直接套接字连接相差不大。请问有人能够为我比较这两个概念吗?

2个回答

86

这两者是无法比较的,因为它们代表不同的层次。就像将关系数据库与磁盘上的文件或将房子与砖块进行比较(即使构建数据库需要文件和建造房屋需要砖块,有时您只需要一个文件或一个砖块,但这并不能使它们可比)。

消息队列是一种软件,将发送方和接收方粘合在一起,使它们可以相互通信,而无需彼此了解太多(当然,它们都需要知道队列),也不需要实现网络代码、处理失败、将一个消息路由到许多接收者等。即使发送方和接收方从未同时处于活动状态,系统也能正常工作,因为队列还可用作未投递消息的临时存储。除此之外,队列可以提供其他服务,如授权、事务等。

套接字连接是低级网络抽象,表示“当前两个程序可以彼此在网络上发送数据,至少直至某些原因断开连接”。因此,通常情况下,消息队列将使用套接字连接在网络上工作。

顺便说一下:您提到的MDB(Message Driven Bean)不是消息队列(就像JDBC不是数据库)。它是用于消费事务性消息的API。它们可以来自队列,但不一定。


噢,好的,谢谢。所以当有人只使用套接字传输数据时,他们只是为自己增加了更多手动和复杂的工作?我的意思是消息队列只是在这之上让事情变得更容易。就像纯文件上面的数据库一样。我想那个人可能是指并没有添加太多不能使用套接字本身实现并手动编码的功能。无论如何,还是感谢澄清。 - Sara
以下是他对我上面问题的回答: “我们可以使用简单的套接字连接来实现消息传递。优点和缺点: 套接字级别编码可能更紧凑,基于我们的需求。然而,它需要开发人员管理许多软件包中已经可用的功能。选择是基于许多因素(时间、成本、人才、未来人才)做出的决策。” - Sara
4
这个答案确实正确,但也相当通用。它还包括自己开发http服务器、数据库、操作系统等方面。用自研产品替换这样成熟的产品可能只有在您有非常特定且同时非常有限的需求时才是现实的选择(例如,当您需要一个非常快速而紧凑的队列,但不需要可靠性或安全性时)。 - fdreger

8

二者在以下方面有着完全不同的含义;

  1. 套接字(Socket)允许已知彼此的客户端之间建立连接(例如,客户端和后端服务或后端服务之间等)。

  2. 消息队列主要作为消息驱动系统中不同后端服务之间的接口。这些服务无需知道它们正在与谁通信,除了消息代理(Message broker) (例如,rabbitMQ,activeMQ,Kafka)。这确保即使其中一个服务停机,消息也不会丢失。一旦服务重新启动,消息代理将消息发送给消费者。


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