# 2. RabbitMQ 引言

# 2.1 RabbitMQ

官网:RabbitMQ (opens new window)

RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ 服务器是用 Erlang (opens new window) 语言编写的,而群集和故障转移是构建在开放电信平台 (opens new window)框架上的。所有主要的编程语言均有与代理接口通讯的客户端库)。

image-20200920224536743

RabbitMQ 高性能的原因

  1. Erlang 是一门专门为交换机软件开发诞生的编程语言,进程间上下文切换效率远高于 C 语言和 Java 语言。
  2. Erlang 的网络性能有着和原生 Socket 一样的延迟,网络 IO 性能非常高。

# 2.2 AMQP

AMQP,即 Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

AMQP 在 2003 年时被提出,最早用于解决金融领不同平台之间的消息传递交互问题。更准确的说是一种 binary wire-level protocol(链接协议)。这是其和 JMS 的本质差别,AMQP 不从 API 层进行限定,而是直接定义网络交换的数据格式。这使得实现了 AMQP 的 provider 天然性就是跨平台的。

# 2.2.1 AMQP 协议模型

image-20210319171402317

# Broker

接收和分发消息的应用,RabbitMQ 就是 Message Broker。

# Virtual Host

虚拟 Broker,将多个单元隔离开。(也叫 cluster)

# Connection

publisher/consumer 和 broker 之间的 TCP 连接。

# Channel

connection 内部建立的逻辑连接,通常每个线程创建单独的 channel。

# Routing Key

路由键,用于指示消息的路由转发,相当于快递的地址。

# Exchange

交换机,相当于快递的分拨中心。

# Queue

消息队列,消息最终被送到这里等待 consumer 取走。

# Binding

exchange 和 queue 之间的虚拟连接,用于 message 的分发依据。

# 2.2.2 核心概念 Exchange

  • Exchange 的功能是根据绑定关系 binding 和路由键 routing key 为消息提供路由,将消息转发至相应的队列。

# ① Direct

Meesage 中的 Routing Key 如何和 Binding Key 一致,Direct Exchange 则将 message 发到对应的 queue 中。

image-20210319194649966

# ② Topic

根据 Routing Key 及通配规则,Topic Exchange 将消息分发到目标 Queue 中。

  • 全匹配:与 Direct 类似

  • #:匹配任意个数的单词

    (Binding Key)key.#.money 可以匹配到(Routing Key) key.money、key.a.money、key.a.b.money。

  • *:匹配一个单词

    (Binding Key)key.*money 可以匹配到(Routing Key) key.a.money、key.b.money,不能匹配 key.a.money、key.a.b.money。

# ③ Fanout

每个发到 Fanout Exchange 的 message 都会发到所有绑定的 queue 上去。

image-20210319194812969

# ④ Headers

# 为什么 AMPQ 协议要设置 Exchange 这个组件?
1. 实现生产者与消费者的解耦。

# 2.3 JMS 协议

JMS 即 Java 消息服务(Java Message Service)应用程序接口,是一个 Java 平台 (opens new window)中关于面向消息中间件 (opens new window)(MOM)的 API (opens new window),用于在两个应用程序之间,或分布式系统 (opens new window)中发送消息,进行异步通信 (opens new window)。Java 消息服务是一个与具体平台无关的 API,绝大多数 MOM 提供商都对 JMS 提供支持。

JMS 是一种与厂商无关的 API,用来访问收发系统消息,它类似于 JDBC (opens new window)(Java Database Connectivity)。这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商都支持 JMS,包括 IBM 的 MQSeries、BEA 的 Weblogic JMS service和 Progress 的 SonicMQ。 JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JMS客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本(TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。

上次更新: 9/14/2022, 12:20:56 AM