# RabbitMQ相关概念

特点

  • 可靠性:持久、传输确认、发布确认
  • 路由灵活:交换器
    • 内置交换器
    • 支持绑定多个交换器形成复杂路由
    • 插件机制
  • 扩展性:集群,动态扩展集群节点
  • 高可用:设置镜像
  • 多协议,多客户端,管理界面
  • 插件机制

相关概念

  • 生产者:消息包含2部(消息体,标签)
  • 消费者:路由过程中标签会被丢弃,存入队列中的消息只有消息体
  • Broker:消息中间件服务节点
  • 队列:内部对象,用于存储消息,消息存储在队列中。多个消费者可订阅同一个队列。不支持队列层面的广播消息
  • 交换器:Exchange,消息先到交换器,由交换器把消息路由到一个或多个队列,如果路由不到则丢弃或返回生产者
  • 路由键:RoutingKey,需要与交换器类型绑定键联合使用
  • 绑定:Binding,通过绑定交换器队列关联,BindingKey 绑定键

示例

// 连接到Broker,建立一个Connection,开启一个信道Channel
...
//  direct 类型的交换器中他们是同一个东西
ROUTING_KEY=BINDING_KEY;
// 声明一个交换器,并设置相关属性(创建一个 type=direct 持久化、非自动删除的交换器)
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, null);
// 声明一个队列,并设置相关属性(创建一个:持久化、非排他的、非自动删除的队列)
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
// 通过路由键将交换器与队列绑定起来
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, BINDING_KEY);
// 发送消息到Broker,其中包含:路由键,交换器等信息
String message = "Hello World!";
channel.basicPublish(EXCHANGE_NAME,
                     ROUTING_KEY,
                     MessageProperties.PERSISTENT_TEXT_PLAIN,
                     message.getBytes());
// 相应交换器根据接收到的路由键查找匹配的队列
// 找到:存储相应的队列中
// 没找到:根据生产者配置的属性,丢弃或者回退给生产者
// 关闭信道和键接

// 消费者
// 键接到Broker,创建一个键接Connection,开启一个信道Channel
// 向Broker请求消费相应队列中的消息,设置回调函数,及做准备工作
// 待等Broker回应及投递队列中的消息,消费者消费消息
// 消费者确认(ack)接收消息
// RabbitMQ从队列中删除被确认的消息
// 关闭信息及链接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  • 绑定时使用BindingKey:channel.exchangeBind,channel.queueBind
  • 发送消息使用RoutingKey:channel.basicPublish

交换器类型

  • Fanout:广播,广播到绑定的交换器队列
  • Direct:路由到RoutingKey与BindingKey完全相同的队列
  • Topic:路由到RoutingKey与BindingKey相匹配的队列中,但匹配规则不同
    • RoutingKey为带 .分隔的字符串,如:com.tianjiaguo.site
    • BindingKey同样是一个带 .的字符串
    • BindingKey可以模糊匹配
      • #匹配一个单词
      • *匹配多规格单词,可以是0个
  • Headers:不依赖于路由键匹配规则来路由信息,根据发送内容的Header属性来进行匹配
  • System
  • 自定义

AQMP协议

上次更新: : 19 days ago