java - AMQP 中的 channel 和链接有什么区别?

标签 java c# rabbitmq network-programming amqp

我正在尝试理解 AMQP 协议(protocol)的框架部分。我知道 AMQP 首先打开一个 TCP 连接,然后在这个连接中使用多个 channel 来防止设置多个 TCP 连接的开销(这很好地解释了 here )。 现在我正在努力理解链接是如何发挥作用的。所以根据我的理解,它的工作原理如下:

  1. 在两个容器(基本上是两个程序)之间建立连接(大多数情况下是 TCP)
  2. 创建了多个 channel 。它们不绑定(bind)到任何节点
  3. 一个 session 结合了每个方向的两个 channel ,仍然没有绑定(bind)到任何节点
  4. “链接”将 session 绑定(bind)到两端的两个节点

我的理解对吗?既然已经有了 channel ,为什么还需要“链接”的概念呢?为什么不直接在两个节点之间建立一个 channel 呢?用简单的英语来说, channel 和链接之间的区别是什么?

Microsoft状态:

A channel is a unidirectional, outbound, virtual transfer path on top of the connection.

A link is a communication path created over a session that enables transferring messages in one direction

这对我来说基本上是一样的。 如果有人能用简单的术语解释 channel 、 session 和链接之间的关系,我将非常高兴。

最佳答案

长话短说

连接 由连接两个节点的单向 channel 组成。

channel 因此是可以构成连接的节点之间的单向通信

session 由两个 channel (传入和传出)组成

Link协议(protocol)是AMQP的核心。链路提供两个节点之间的单向传输。链接在终点 连接到节点。有两种终点:源和目标。终端负责跟踪特定传入或传出消息流的状态。源跟踪传出消息,目标跟踪传入消息。

注意:您可以将终端视为客户端中的套接字,您可以将其关联到精确的功能,例如源/目标。

完整解释

以下所有信息和图像均来自协议(protocol) OASIS 高级消息队列协议(protocol) (AMQP) 版本 1.0 的规范。有关更多信息,您应该阅读 this .

AMQP 网络由通过链接连接的节点组成。节点是负责安全存储和/或传递消息的命名实体。消息可以源自节点、终止于节点或由节点中继。

为了在不同容器中的节点之间进行通信,需要建立连接。 AMQP 连接由全双工、可靠排序的帧序列组成。帧是在线路上承载的工作单元。

enter image description here

AMQP 连接被划分为协商数量的独立单向 channel 。一个 AMQP session 将两个单向 channel 相关联以形成双向、顺序的对话 两个容器。

enter image description here

单个连接可能有多个独立的 session 同时处于 Activity 状态,直到协商的 channel 限制。连接和 session 都由每个对等方建模为端点,这些端点存储有关连接或 session 的本地和最后已知的远程状态。

enter image description here

为了在节点之间传输消息,需要在节点之间建立链接。链路是两个节点之间的单向路由。链接在终点附加到节点。有两种终点:源和目标。终端负责跟踪传入或传出消息的特定流的状态。

链接根据传输的消息数量提供基于信用的流量控制方案,允许应用程序控制在给定点从哪些节点接收消息

enter image description here

关于java - AMQP 中的 channel 和链接有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60395765/

相关文章:

java - 3.3 到 3.4 之间的 Mule 消息不兼容问题

java - 文本读取和替换算法

c# - 如何停止延长 ajax 调用的 cookie 过期时间?

c# - C#如何打开一个Word文件并设置相对于项目文件夹的路径

rabbitmq - 当 "re"通过 socket.io 连接时,Node.js + socket.io + node-amqp 和队列 binginds

django - rabbitmq+celery 内存泄漏?

java - 在 Eclipse 中执行 "mvn dependency:tree"*

c# - 无法转换对象类型 "System.Web.Mvc.HtmlHelper` 1 [System.Object] "to type"System.Web.Mvc.HtmlHelper "

java - RabbitMQ - 没有找到停止 Spring 服务器的队列

java - java jni native 报错