【问题标题】:Message queues vs sockets消息队列与套接字
【发布时间】:2024-01-12 09:58:01
【问题描述】:

我没有太多的套接字编程经验,但我尝试阅读了一些有关它的内容。我对 MDB 和消息队列非常熟悉。有人告诉我,队列(例如 MDB)“只不过是直接套接字连接”。谁能帮我比较一下这两个。

【问题讨论】:

    标签: sockets websocket message-queue message-driven-bean


    【解决方案1】:

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

    消息队列是一个将发送者和接收者粘合在一起的软件,这样他们就可以在不了解彼此的情况下进行通信(当然,他们都需要了解队列)并且不需要实现网络代码,处理故障,将一条消息路由到多个接收者等。即使发送者和接收者从未同时处于活动状态,系统也能正常工作,因为队列还可以作为未传递消息的临时存储。除此之外,队列还可以提供额外的服务,如授权、交易等。

    套接字连接是一种低级网络抽象,它表示:“目前两个程序可以通过网络相互发送数据,至少在连接因某种原因中断之前”。所以是的,通常消息队列将使用套接字连接在网络上工作。

    顺便说一句:您提到的 MDB(消息驱动 Bean)不是消息队列(就像 JDBC 不是数据库一样)。它是一个用于消费事务性消息的 API。他们可能来自队列,但他们不必这样做。

    【讨论】:

    • 哦,好的,谢谢。那么当有人实际上只使用套接字来传输数据时,他们只会让事情变得更加手动和复杂吗?我的意思是消息队列只是为了让我们更轻松。就像纯文件之上的数据库。我认为那个人可能意味着没有添加太多您无法使用套接字自己实现并手动对其进行编码的功能。无论如何感谢您的澄清。
    • 所以这是他对我上述问题的回答:“我们可以使用简单的套接字连接来实现消息传递。优点和缺点:套接字级别的编码可能更紧凑,并且基于我们的需要。但是,它要求开发人员管理许多软件包中已经可用的功能。选择是基于许多因素(时间、成本、人才、未来人才)的决策"
    • 答案当然是对的,但也很笼统。它还包括推出自己的 http 服务器、数据库、操作系统等。仅当您有非常具体且同时非常有限的要求时(例如,当您的队列必须非常快速和紧凑,但不需要可靠时或安全)。
    【解决方案2】:

    两者在某种意义上是完全不同的;

    1. Socket 允许在同时认识自己的客户端之间建立连接(例如,在客户端和后端服务之间或在后端服务之间)。

    2. 消息队列主要充当消息驱动系统中不同后端服务之间的接口。除了消息代理(例如,rabbitMQ、activeMQ、Kafka)之外,服务不需要知道它们正在与谁通信。这确保即使其中一项服务关闭,消息也不会丢失。服务启动后,消息代理立即将消息发送给消费者。

    【讨论】: