【发布时间】:2024-01-12 09:58:01
【问题描述】:
我没有太多的套接字编程经验,但我尝试阅读了一些有关它的内容。我对 MDB 和消息队列非常熟悉。有人告诉我,队列(例如 MDB)“只不过是直接套接字连接”。谁能帮我比较一下这两个。
【问题讨论】:
标签: sockets websocket message-queue message-driven-bean
我没有太多的套接字编程经验,但我尝试阅读了一些有关它的内容。我对 MDB 和消息队列非常熟悉。有人告诉我,队列(例如 MDB)“只不过是直接套接字连接”。谁能帮我比较一下这两个。
【问题讨论】:
标签: sockets websocket message-queue message-driven-bean
两者是无法比拟的,因为它们代表不同的层。这就像将关系数据库与磁盘上的文件进行比较或将房屋与砖块进行比较(即,您当然需要文件来构建数据库,而需要砖块来建造房屋,有时您需要的只是文件或砖块,但这并不使它们具有可比性)。
消息队列是一个将发送者和接收者粘合在一起的软件,这样他们就可以在不了解彼此的情况下进行通信(当然,他们都需要了解队列)并且不需要实现网络代码,处理故障,将一条消息路由到多个接收者等。即使发送者和接收者从未同时处于活动状态,系统也能正常工作,因为队列还可以作为未传递消息的临时存储。除此之外,队列还可以提供额外的服务,如授权、交易等。
套接字连接是一种低级网络抽象,它表示:“目前两个程序可以通过网络相互发送数据,至少在连接因某种原因中断之前”。所以是的,通常消息队列将使用套接字连接在网络上工作。
顺便说一句:您提到的 MDB(消息驱动 Bean)不是消息队列(就像 JDBC 不是数据库一样)。它是一个用于消费事务性消息的 API。他们可能来自队列,但他们不必这样做。
【讨论】:
两者在某种意义上是完全不同的;
Socket 允许在同时认识自己的客户端之间建立连接(例如,在客户端和后端服务之间或在后端服务之间)。
消息队列主要充当消息驱动系统中不同后端服务之间的接口。除了消息代理(例如,rabbitMQ、activeMQ、Kafka)之外,服务不需要知道它们正在与谁通信。这确保即使其中一项服务关闭,消息也不会丢失。服务启动后,消息代理立即将消息发送给消费者。
【讨论】: