火山引擎使用 RabbitMQ 作为消息引擎,RabbitMQ 是一个生产者和消费者模型,主要负责接收、存储和转发消息。以下概念基于RabbitMQ进行描述。
消息 (Message)
消息一般分为两部分,消息体和标签。标签主要用来描述这条消息,消息体是消息的内容,是一个 JSON 体或者数据等。生产者发送消息,消费者消费消息,生产者与消费者彼此并无直接关系。
生产者(Producer)
即向队列发送消息的一方。发布消息的最终目的在于将消息内容传递给其他系统或模块,使对方按照约定处理该消息。
消费者(Consumer)
接收消息的一方。消费者订阅 RabbitMQ 的队列,当消费者消费一条消息时,只是消费消息的消息体。在消息路由的过程中,会丢弃标签,存入到队列中的只有消息体。
队列(Queue)
队列是用于存储消息的,生产者将消息送到队列,消费者从队列中获取和消费消息。多个消费者可以同时订阅同一个队列,队列里的消息分配给不同的消费者。
Virtual Host 提供了资源逻辑隔离的能力,它允许用户在 RabbitMQ 服务器上创建多个独立的消息代理环境。每个 vhost 都有自己的 Queue、Exchange、Binding 和权限限制,使得不同的应用程序或服务可以在相互隔离的环境中进行通信。每个 RabbitMQ 服务器都有一个默认的 vhost,即 "/"。
代理(Broker)
消息中间件的服务节点。
交换器(Exchange)
也称为路由器,负责将生产者的消息路由到相应的 Queue 组件。Exchange 根据 Binding Key、Routing Key 以及 Exchange Type 属性路由消息。
绑定(Binding)
关联 Exchange 组件与 Queue 组件。
通过 Binding Key 将 Queue 组件绑定(Binding)到 Exchange 组件,当消息的 Routing Key 与 Binding Key 匹配时,消息将会被路由到 Binding Key 所绑定的 Queue 组件中。允许使用相同的 Binding Key 将多个 Queue 绑定到同一个 Exchange。
生产者发送给 Exchange 的消息一般会携带一个 Routing Key,用以指定该条消息的路由规则。在 Exchange Type 与 Binding Key 固定的情况下,生产者可通过指定 Routing Key 来指定消息流向哪里。
常用的有 Direct Exchange、Topic Exchange 和 Fanout Exchange 共三种 Exchange Type。
- Direct Exchange:Exchange 会按照 Binding Key 和 Routing Key 完全匹配的规则来路由消息。
- Topic Exchange:Exchange 会根据 Binding Key 和 Routing Key 通配符匹配的规则来路由消息。
- Fanout Exchange:Exchange 会忽略 Routing Key 和 Binding Key 的匹配规则,将消息路由到它绑定的所有 Queue中。
连接(Connection)
生产者或消费者应用系统与消息队列 RabbitMQ版之间的物理 TCP 连接。
通道(Channel)
建立在物理 TCP 连接中的虚拟连接,当生产者或消费者客户端与消息队列 RabbitMQ版建立连接后,所有 AMQP 命令(例如生产或消费消息、创建或订阅队列等)都是通过 Connection 连接中的 Channel 发出完成。在一个 TCP 连接中可同时建立多个 Channel,以此来实现 TCP 连接的多路复用。
高级消息队列协议,一个提供统一消息服务的应用层标准协议,为面向消息的中间件设计。AMQP定义了一套网络协议和消息代理服务的功能语义,确保不同客户端应用和消息中间件之间的全功能互操作性。
消息队列遥测传输协议,一个基于客户端-服务器的消息发布/订阅传输协议。它工作在 TCP/IP协议之上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的协议。
一种为应用程序和共享库的开发者提供用于验证、数据完整性检查和加密的机制。