1. rabbitmq介绍
rabbitmq是一款使用Erlang语言开发的,实现AMQP(高级消息队列协议)的开源消息中间件
1.1 特性
- 可靠性。支持持久化,传输确认,发布确认等保证了MQ的可靠性
- 灵活的分发消息策略。这应该是rabbitmq的一大特点。在消息进入MQ前由Exchange(交换机)进行路由消息。分发消息策略有: 简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式
- 支持集群。多台rabbitmq服务器可以组成一个集群,形成一个逻辑Broker
- 多种协议。rabbitmq支持多种消息队列协议,比如 STOMP、MQTT 等等
- 支持多种语言客户端。rabbitmq几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等
- 可视化管理界面。rabbitmq提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker
- 插件机制。rabbitmq提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件
1.2 概念
- Broker: 简单来说就是消息队列服务器实体
- Exchange: 消息交换机,它指定消息按什么规则,路由到哪个队列。
- Queue: 消息队列载体,每个消息都会被投入到一个或多个队列。
- Binding: 绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
- Routing Key: 路由关键字,exchange根据这个关键字进行消息投递。
- vhost: 虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
- producer: 消息生产者,就是投递消息的程序。
- consumer: 消息消费者,就是接受消息的程序。
- channel: 消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
1.3 Exchanges
1. 简介
rabbitmq 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。 实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中。 相反,生产者只能将消息发送到交换机(exchange)
,交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面将它们推入队列。 交换机必须确切知道如何处理收到的消息。是应该把这些消息放到特定队列还是说把他们到许多队列中还是说应该丢弃它们。这就的由交换机的类型来决定。
2. 交换机类型
1. Direct Exchange
处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键
“abc”,则只有被标记为“abc”的消息才被转发,不会转发abc.def,也不会转发dog.ghi,只会转发abc。
2. Fanout Exchange
不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。
3. Topic Exchange
将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“”匹配不多不少一个词。因此“abc.#”能够匹配到“abc.def.ghi”,但是“abc.” 只会匹配到“abc.def”。
4. Headers Exchanges
不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到rabbitmq时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic
的路由键都需要要字符串形式的。
1.4 消息持久化
消息可能丢失的步骤
- 生产者到Broker过程中丢失消息
解决方法: 开启发布确认
- 单个发布确认
- 批量发布确认
- 批量异步发布确认
- Broker宕机丢失消息
解决方法: 消息持久化
- Broker到消费者过程中丢失消息
解决方法: 消息应答
1.5 消息幂等性
- 利用redis原子性进行消息去重处理
1.6 死信的条件
- 消息TTL过期
- 消息队列已满
- 消息被拒绝
1.7 拓展
1. rabbitmq用户角色
用户角色可分为五类:超级管理员、监控者、策略制定者、普通管理者以及其他
- 超级管理员(administrator)
可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户、策略(policy)进行操作 - 监控者(monitoring)
可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数、内存使用情况、磁盘使用情况等) - 策略制定者(policymaker)
可登陆管理控制台(启用management plugin的情况下),同时可以对policy进行管理,但无法查看节点的相关信息 - 普通管理者(management)
仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理 - 其他 无法登陆管理控制台,通常就是普通的生产者和消费者 了解了这些后,就可以根据需要给不同的用户设置不同的角色,以便按需管理
1 | 设置用户角色的命令为: |
2. 用户权限
- 用户权限指的是用户对 exchange、queue 的操作权限,包括配置权限、读写权限。 配置权限会影响到 exchange,queue 的声明和删除。
- 读写权限影响到从queue里取消息,向exchange发送消息以及queue和exchange的绑定(bind)操作 例如: 将queue绑定到某exchange上,需要具有queue的写权限,以及exchange的读权限。 向exchange发送消息需要具有exchange的写权限。 从queue里取数据需要具有queue的读权限。
1 | 设置用户角色的命令为: |
3. vhost 操作
1 | ./rabbitmqctl delete_vhost / |