火山引擎使用 RabbitMQ 作为消息引擎,RabbitMQ 是一个生产者和消费者模型,主要负责接收、存储和转发消息。以下概念基于RabbitMQ进行描述。
消息一般分为两部分,消息体和标签。标签主要用来描述这条消息,消息体是消息的内容,是一个 JSON 体或者数据等。生产者发送消息,消费者消费消息,生产者与消费者彼此并无直接关系。
即向队列发送消息的一方。发布消息的最终目的在于将消息内容传递给其他系统或模块,使对方按照约定处理该消息。
接收消息的一方。消费者订阅 RabbitMQ 的队列,当消费者消费一条消息时,只是消费消息的消息体。在消息路由的过程中,会丢弃标签,存入到队列中的只有消息体。
队列是用于存储消息的,生产者将消息送到队列,消费者从队列中获取和消费消息。多个消费者可以同时订阅同一个队列,队列里的消息分配给不同的消费者。
Virtual Host 提供了资源逻辑隔离的能力,它允许用户在 RabbitMQ 服务器上创建多个独立的消息代理环境。每个 vhost 都有自己的 Queue、Exchange、Binding 和权限限制,使得不同的应用程序或服务可以在相互隔离的环境中进行通信。每个 RabbitMQ 服务器都有一个默认的 vhost,即 "/"。
消息中间件的服务节点。
也称为路由器,负责将生产者的消息路由到相应的 Queue 组件。Exchange 根据 Binding Key、Routing Key 以及 Exchange Type 属性路由消息。
关联 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 Exchang 共三种 Exchange Type。
生产者或消费者应用系统与消息队列 RabbitMQ版之间的物理 TCP 连接。
建立在物理 TCP 连接中的虚拟连接,当生产者或消费者客户端与消息队列 RabbitMQ版建立连接后,所有 AMQP 命令(例如生产或消费消息、创建或订阅队列等)都是通过 Connection 连接中的 Channel 发出完成。在一个 TCP 连接中可同时建立多个 Channel,以此来实现 TCP 连接的多路复用。