1 AMQP相关概念介绍

  • AMQP是一个提供统一消息服务的应用层标准高级消息队列协议,是应用程协议的一个开放标准,AQMP是为面向消息的中间件设计的协议。
  • AMQP是一个二进制协议,拥有诸如:多信道、协商式、异步、安全、跨平台、中立和高效等特点。
  • RabbitMQ是AMQP协议的Erlang的实现。
  • AMQP的相关概念如下: | 概念 | 描述 | | —- | —- | | 连接Connection | 一个网络连接,比如TCP/UDP套接字连接。 | | 会话Session | 端点之间的命名对话。在一个会话上下文中,保证“恰好传递一次”。 | | 信道Channel | 多路复用连接中的一条独立的双向数据流通道,为会话提供物理传输介质。 | | 客户端Client | AMQP连接或者会话的发起者。AMQP是非对称的,客户端生产消息和消费消息,服务器存储和路由消息。 | | 服务节点Broker | 消息中间件的服务节点:一般情况下可以将一个RabbitMQ Broker看做一台RabbitMQ服务器。 | | 端点 | AMQP对话的任意一方。一个AMQP连接包括两个端点:一个是客户端,一个是服务器。 | | 消费者Consumer | 一个从消息队列里请求消息的客户端程序。 | | 生产者Producer | 一个向交换机发布消息的客户端应用程序。 |

2 RabbitMQ运转流程

RabbitMQ运转流程.png

  • 在入门案例中:
  • AMQP - 图2生产者发送消息:
    • 生产者创建连接(Connection),开启一个通道(Channel),连接到RabbitMQ Broker。
    • 声明队列并设置属性,比如:是否排他,是否持久化,是否自动删除等。
    • 将路由键(空字符串)和队列绑定在一起。
    • 发送消息到RabbitMQ Broker。
    • 关闭信道。
    • 关闭连接。
  • AMQP - 图3消费者接受消息:
    • 消费者创建连接(Connection),开启一个通道(Channel),连接到RabbitMQ Broker。
    • 向Broker请求消费相应队列中的消息,设置相应的回调函数。
    • 等到RabbitMQ Broker回应并投递响应队列中的消息,消费者接受消息。
    • 确认(ack,自动确认)接受到消息。
    • RabbitMQ从队列中删除相应的有已经被确认的消息。
    • 关闭信道。
    • 关闭连接。

3 生产者流转过程说明(了解)

生产者流转过程说明.png

  • AMQP - 图5客户端与代理服务器Broker建立连接:会调用newConnection() 方法,这个方法会进一步封装Protocol Header 0-9-1 的报文头发送给Broker ,以此通知Broker 本次交互采用的是AMQPO-9-1 协议,紧接着Broker 返回Connection.Start 来建立连接,在连接的过程中涉及Connection.Start/.Start-OK 、Connection.Tune/.Tune-Ok ,Connection.Open/ .Open-Ok 这6 个命令的交互。
  • AMQP - 图6客户端调用connection.createChannel方法:此方法开启信道,其包装的channel.open命令发送给Broker,等待channel.basicPublish方法,对应的AMQP命令为Basic.Publish,这个命令包含了content Header 和content Body()。content Header 包含了消息体的属性,例如:投递模式,优先级等,content Body 包含了消息体本身。
  • AMQP - 图7客户端发送完消息需要关闭资源时,涉及到Channel.Close和Channl.Close-Ok 与Connetion.Close和Connection.Close-Ok的命令交互。

4 消费者流转过程说明(了解)

消费者流转过程说明.png

  • AMQP - 图9消费者客户端与代理服务器Broker建立连接:会调用newConnection() 方法,这个方法会进一步封装Protocol Header 0-9-1 的报文头发送给Broker ,以此通知Broker 本次交互采用的是AMQPO-9-1 协议,紧接着Broker 返回Connection.Start 来建立连接,在连接的过程中涉及Connection.Start/.Start-OK 、Connection.Tune/.Tune-Ok ,Connection.Open/ .Open-Ok 这6 个命令的交互。
  • AMQP - 图10消费者客户端调用connection.createChannel方法:和生产者客户端一样,协议涉及Channel . Open/Open-Ok命令。
  • AMQP - 图11在真正消费之前,消费者客户端需要向Broker 发送Basic.Consume 命令(即调用channel.basicConsume 方法〉将Channel 置为接收模式,之后Broker 回执Basic . Consume - Ok 以告诉消费者客户端准备好消费消息。
  • AMQP - 图12Broker向消费者客户端推送(Push) 消息,即Basic.Deliver 命令,这个命令和Basic.Publish 命令一样会携带Content Header 和Content Body。
  • AMQP - 图13消费者接收到消息并正确消费之后,向Broker 发送确认,即Basic.Ack 命令。
  • AMQP - 图14客户端发送完消息需要关闭资源时,涉及到Channel.Close和Channl.Close-Ok 与Connetion.Close和Connection.Close-Ok的命令交互。

5 合理的交换机和队列设置

**

  • 交换机的数量不能过多,一般来说,同一个业务,或者同一类业务使用同一个交换机。
  • 合理设置队列数量,一般来说,一个微服务监听一个队列,或者一个微服务的一个业务监听一个队列。
  • 合理配置交换机类型,使用Topic模式的时候仔细设置绑定键。

6 尽量使用自动化配置

**

  • 将创建交换机和队列的操作固化在应用代码中,免去复杂的运维操作,高效而且不易出错。
  • 一般来说,交换机由双方同时声明,队列由接收方声明并配置绑定关系。
  • 交换机和队列的参数一定要由双方开发团队确认,否则重复声明时,如果参数不一致,会导致声明失败。