2023-07-06:RabbitMQ 中的 AMQP 是什么?
2023-07-06:RabbitMQ 中的 AMQP 是什么?
答案 2023-07-06:
AMQP
AMQP(Advanced Message Queuing Protocol)是一个应用层协议的开放标准,旨在设计面向消息的中间件。基于 AMQP 协议的客户端和消息中间件可以自由地传递消息,不受客户端、中间件产品或开发语言的限制。其目标是实现一种被广泛应用于各行业的标准消息中间件技术,以降低企业和系统集成的成本,并提供工业级的集成服务。RabbitMQ 是 AMQP 协议的一个主要实现。
客户端与 RabbitMQ 的通讯
连接
作为客户端(生产者或消费者),要与 RabbitMQ 通信,首先需要建立一条 TCP 连接。在建立连接后,客户端需要发送一条"问候语",以确保彼此都遵循 AMQP 协议。这类似于与他人打招呼时说"你好",或者与外国人打招呼时说"hello"。一旦确认了使用相同的"语言",客户端和 RabbitMQ 就完成了"认证"。然后,它们可以创建一个 AMQP 信道来进行通信。
信道
信道是生产者和消费者与 RabbitMQ 进行通信的通道。它是在 TCP 连接上建立的虚拟连接。这意味着 RabbitMQ 可以在一条 TCP 连接上创建多个信道,以便处理多个线程。每个线程对应一个唯一的信道 ID,从而保证了信道的私有性,并与特定的线程相关联。
为什么不使用多个 TCP 连接呢?这是因为通过多路复用技术,RabbitMQ 可以在单个 TCP 连接上支持成百上千的信道。每秒创建和销毁大量的 TCP 连接对系统性能消耗较大。因此,选择在一条 TCP 连接上建立多个信道是为了保证性能。
从技术上讲,这被称之为“多路复用”,对于执行多个任务的多线程或者异步应用程序来说,它非常有用。
虚拟主机
虚拟主机(Virtual Host),简称 vhost,实质上是一个精简版的消息队列服务器,拥有自己的队列、交换器和绑定,而且最重要的是具备独立的权限机制。虚拟主机能够在逻辑上实现客户端之间的隔离,避免队列和交换器名称的冲突。在连接到 RabbitMQ 时,必须指定虚拟主机。RabbitMQ 默认包含一个名为"/"的虚拟主机,通过默认的用户和密码(guest)进行访问。
在 RabbitMQ 中创建用户时,必须将其分配给至少一个虚拟主机,并且该用户只能访问其所分配的虚拟主机中的队列、交换器和绑定。虚拟主机的创建需要通过 RabbitMQ 的管理控制工具进行操作。
交换器类型
交换器类型共有四种:direct、fanout、topic 和 headers。其中,headers 类型与 direct 类型非常相似且不常使用,可以忽略不计。
Direct
Direct 交换器是一种路由键完全匹配的交换器类型,它将消息按照路由键的完全匹配进行投递到相应的队列。Direct 交换器是 RabbitMQ 的默认交换器。当声明一个队列时,它会自动绑定到默认的 Direct 交换器,并以队列名称作为路由键进行消息的发布:channel->basic_public($msg,’’,’queue-name’)。
Fanout
Fanout 交换器将消息广播到所有绑定的队列,不管队列是否绑定了特定的路由键。当消息经过 Fanout 交换器时,每个队列都会收到一份复制的消息。
Topic
Topic 交换器通过使用“”和“#”通配符来处理消息的路由键,从而将来自不同源头的消息投递到同一个队列。在 Topic 交换器中,路由键可以包含多个标识符,通过使用“.”进行分隔。“”通配符用于匹配一个标识符,而“#”通配符用于匹配一个或多个标识符。
版权声明: 本文为 InfoQ 作者【福大大架构师每日一题】的原创文章。
原文链接:【http://xie.infoq.cn/article/b20cdd240a0f4ae657163fd80】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论