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

27

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

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

通道是传输消息的媒介。
这到底意味着什么?在一本名为“企业集成模式”的书中,它说:

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

这是否意味着这个消息通道实际上将队列抽象化了,使消息的生产者和消费者无需直接与队列打交道呢?但事实并非如此吧?当生产者需要将消息放入队列时,它实际上指定了要连接的队列管理器和队列名称。

还有通道中不同协议和不同数据格式的概念,在其中您可能会为每个使用的协议设置单独的通道,并为每种数据格式(XML、JSON等)设置单独的通道。这将便于不同的队列从不同的通道中获取消息。但为什么不为不同的数据格式直接调用不同的队列呢?通道的作用究竟是什么?它只是一个连接吗?

我对MQM完全是新手。我刚被分配到这个涉及生产和消费消息的项目中,并且正在努力理解。

3个回答

17

稍微解释一下 Shashi 的回答,需要注意的是,所提到的 EIP 书籍讨论的是高级消息传递模式。在这种情况下,作者需要一个通用术语来表示消息在两个点之间传输的媒介,并选择了单词“channel”。

对于该书来说,channel 连接任何两个移动消息的端点,适用于任何消息传输供应商。在这种情况下,通道具有不同类别的服务属性,支持各种模式,可以是 1-1,1-多,多-1,多-多等等。

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

基于这个例子,显然可知道,书中所用的 channel 和任何消息传输定义的 channel 处于不同的抽象层次上。在 MQ 中使用时,channel 是一组特定的配置参数,定义通信路径并包括诸如 CONNAMEMAXMSGL、调优参数、SSL 参数等属性。一旦成功启动 MQ channel,就可以通过显示通道状态来查看其运行实例。对于 CLUSRCVRSVRCONN,以及较少使用的 RCVRRQSTR 通道,可能会同时看到多个同一通道的实例处于活动状态。

如果你还在跟我一起,你可能会注意到,在MQ中使用术语“channel”时,总是描述一个或多个点对点网络连接,而EIP书中“channel”的用法大致翻译为“在应用程序端点之间传递消息的东西”。请考虑两个直接使用共享内存连接到队列管理器的应用程序将使用EIP定义的一个“channel”,但不是IBM MQ所定义的术语。
基于这个例子,可以清楚地看到,EIP版本的“通道”术语包括队列管理器和队列管理器与应用程序端点之间的任何MQ连接。
总之: - EIP书中的“通道”指的是除了应用程序端点之外的所有消息基础结构,在MQ上下文中,它包括队列管理器和任何MQ通道。 - IBM MQ的“通道”是一种特定的配置,定义了队列管理器与另一个队列管理器或客户端应用程序之间的网络连接。
希望这样解释术语可以让你更加明白,而不是让事情变得更加混乱。如果有需要,我会根据任何评论进行更新。

好的,那么EIP书籍中对于通道的定义包括传输介质和队列本身,对吗?是的,这就是让我感到困惑的地方。在WebSphere版本中,正是队列本身抽象了接收者与发送者之间的关系,而不是通道本身,这与书中描述的方式不同。太棒了,现在清晰多了,谢谢 :) - alokraop
感谢 @T.Rob 的进一步澄清。 - Shashi
此外,在EIP书中,您可以阅读到:“_通道_,也称为_队列_,是连接程序并传递消息的逻辑路径。” 此外,在其他具有示例的章节中,您可以看到“在.NET中,MessageQueue类实现了点对点通道”,或者在IBM Websphere MQ for Guaranteed Delivery的示例中,使用DEFINE Q(myQueue)PER(PERS)配置通道以保持持久性。 - Konstantinos

11

消息队列存储生产者发送的消息,以便将其传递给消费者。 通道是传输消息的媒介或通信链接,可以从 生产者到队列, 队列到消费者, 或一个队列管理器中的一个队列到另一个队列管理器中的另一个队列。

有两种类型的通道:

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

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

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

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

希望这有所帮助。


那么通道是连接信息的一部分吗?当我们发送消息时,我们是在说“将消息发送到某个通道B上的队列A”吗?但是如果队列已经被连接到从特定通道接收消息,为什么我们需要在连接中指定队列的名称呢?如果我们通过B推送消息,则队列A应该能够接收到它,对吧?或者可能有多个队列可以连接到同一个通道,因此需要我们更加具体地说明? - alokraop
1
是的,通道是连接信息的一部分。通道用于连接到队列管理器,而不是队列。因此,应用程序没有与队列连接。队列管理器可以包含多个队列。一个应用程序可能会将消息发送到队列管理器Z中的队列A,另一个应用程序可能会从同一队列管理器Z中的队列B接收消息。因此,您需要指定队列名称。请注意,“队列管理器”不存储任何消息,而是队列存储消息。 - Shashi
好的,我觉得我有点明白了。谢谢! - alokraop

4

WebSphere MQ队列

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

参考文献

通道

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

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

参考文献


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