消息通道和消息队列本身有啥区别?

Posted

技术标签:

【中文标题】消息通道和消息队列本身有啥区别?【英文标题】:What is the difference between a message channel and the message queue itself?消息通道和消息队列本身有什么区别? 【发布时间】:2015-10-23 02:02:24 【问题描述】:

消息通道和消息队列本身有什么区别?

它们是不同的东西。队列实际上保存了将按 FIFO 方式处理(推送到侦听器)的消息。

通道是传输消息的媒介。 这到底是什么意思?在《企业集成模式》一书中说:

使用消息通道连接应用程序,其中一个应用程序将信息写入通道,另一个应用程序从通道读取该信息。

这是否意味着这个消息通道实际上将队列从消息的生产者和消费者中抽象出来了?但真的不对吗?当生产者必须将消息放入队列时,它实际上指定了它要连接的队列管理器和队列名称。

还有通道中不同协议和通道中不同数据格式的概念,其中您使用的每个协议可能有一个单独的通道,并且可能每个数据格式(XML、JSON 等)都有一个单独的通道。 这将有助于不同的队列从不同的通道中接听。但是为什么不直接为不同的数据格式调用不同的队列呢?渠道的具体作用是什么?这只是一种联系吗?

我是 MQM 的新手。我刚刚被分配到这个涉及生产和消费消息的项目,我正在努力解决这个问题。

【问题讨论】:

【参考方案1】:

消息队列存储生产者发送的消息,以便将它们传递给消费者。 通道是传输消息的媒体或通信链路 生产者排队, 排队到消费者, 或者一个队列管理器中的一个队列到另一个队列管理器中的另一个队列。

有两种类型的渠道:

1) 消息通道 是两个队列管理器之间的单向通信链路。 消息通道用于在两个队列管理器之间传输消息。

2) MQI 通道 将应用程序(生产者或消费者)连接到服务器机器上的队列管理器。 在 MQ 客户端应用程序和队列管理器之间传输 MQ API 调用和响应需要 MQI 通道。

所以, 简单来说, 通道是客户端应用程序和队列管理器(或队列管理器之间)之间用于发送和/或接收消息的通信媒体。

MQ 使用专有协议将消息从客户端应用程序传输到队列管理器以及队列管理器之间。 消息中包含的数据格式无关紧要, 它可以是任何东西,包括字节、XML 或 JSON。 任何类型的数据都可以通过同一通道发送。

希望这会有所帮助。

【讨论】:

那么通道是连接信息的一部分吗?当我们发送消息时,我们是在说“向某个通道 B 上的队列 A 发送消息”然后呢?但是,如果队列已经连接起来接收来自特定通道的消息,为什么我们需要在连接中指定队列的名称?如果我们通过 B 推送消息,队列 A 应该能够接收到它,对吧?或者会有多个队列可以连接到同一个通道,因此需要我们更具体? 是的,通道是连接信息的一部分。通道用于连接到队列管理器,而不是连接到队列。所以应用程序没有连接到队列。一个队列管理器可以包含多个队列。一个应用程序可能正在向队列管理器 Z 中的队列 A 发送消息,另一个应用程序可能正在从同一队列管理器 Z 中的队列 B 接收消息。因此您需要指定队列名称。请注意,“队列管理器”不存储任何消息,而是存储消息的队列。 好的。我想我有点明白了。谢谢!!【参考方案2】:

WebSphere MQ 队列

队列是消息的容器。连接到托管队列的队列管理器的业务应用程序可以从队列中检索消息,也可以将消息放在队列中。队列在它可以容纳的最大消息数和这些消息的最大长度方面具有有限的容量。

Reference

频道

WebSphere® MQ 使用两种不同类型的通道:

消息通道,它是两个队列管理器之间的单向通信链路。 WebSphere MQ 使用消息通道在队列管理器之间传输消息。要双向发送消息,您必须为每个方向定义一个通道。 MQI(消息队列接口)通道,它是双向的,将应用程序(MQI 客户端)连接到服务器机器上的队列管理器。 WebSphere MQ 使用 MQI 通道在 MQI 客户端和队列管理器之间传输 MQI 调用和响应

Reference

【讨论】:

【参考方案3】:

要扩展 Shashi 的答案,请记住,参考的 EIP 书谈到了高级消息传递模式。在这种情况下,作者需要一个通用术语来表示消息在两点之间传输的媒介,并选择了“通道”一词。

就本书而言,通道连接任何两个移动消息的端点,适用于任何消息传输供应商。在这种情况下,通道具有服务类别的属性并支持各种模式。可能是 1-1、1-many、many-1、many-many 等。

例如,如果是 ZeroMQ,端点是两个点对点节点,它们之间没有消息传递引擎。对于 IBM MQ,一个端点始终是队列管理器(一种消息传递引擎),另一个端点是应用程序或另一个队列管理器。

基于这个例子,很明显,书中使用的 channel 和任何消息传输定义的 channel 处于不同的抽象级别。正如 MQ 所使用的,channel 是一组特定的配置参数,用于定义通信路径并包括诸如CONNAMEMAXMSGL、调整参数、SSL 参数等属性。一旦一个 MQ channel 启动成功,通过显示通道状态可以看到它的运行实例。对于 CLUSRCVRSVRCONN 和(不太常见的)RCVRRQSTR 频道,您可能会看到同一频道的多个实例同时处于活动状态。

如果你还在我身边,你可能已经注意到,channel 一词的 MQ 用法总是描述一个或多个点对点网络连接,而 EIP 书对术语 的用法channel 大致翻译为“在应用程序端点之间移动消息的东西”。考虑使用共享内存直接连接到队列管理器的两个应用程序将使用 EIP 中定义的 channel,但 不是,因为该术语由 IBM MQ 定义。

基于该示例,应该清楚的是,术语通道 的EIP 版本包括队列管理器队列管理器和应用程序端点之间的任何MQ 连接。

总结一下:

EIP 书的通道 是不是应用程序端点之一的所有消息传递基础架构,在 MQ 上下文中它包括队列管理器和任何 MQ 通道。 IBM MQ 通道 是一种特定配置,用于定义队列管理器与另一个队列管理器或客户端应用程序之间的网络连接。

我希望这可以澄清术语,而不是进一步混淆事物。如果需要,我会根据任何 cmets 进行更新。

【讨论】:

好的,所以 EIP 书籍对通道的定义既包含传输媒介又包含队列本身,对吗?是的,这让我很困惑。在 websphere 版本中,是队列从发送者中抽象出接收者,而不是通道本身,这与书中描述的方式不同。凉爽的。现在更清楚了,谢谢:) 感谢@T.Rob 进一步澄清。 此外,在 EIP 书中您可能会读到:“Channels,也称为 queues,是连接程序和传递消息的逻辑路径."。此外,在其他带有示例的章节中,您可以看到“在 .NET 中,MessageQueue 类实现了点对点通道”,或者在 IBM Websphere MQ for Guaranteed Delivery 的示例中,通道被配置为持久使用DEFINE Q(myQueue) PER(PERS)

以上是关于消息通道和消息队列本身有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

activemq消息队列和kafka有啥区别

消息队列入门关于消息队列

Spring使用Spring和AMQP发送接收消息(上)

消息队列(kafka/nsq 等)与任务队列(celery)到底有啥不同

进程间通信——消息队列

消息队列和缓存的区别