RabbitMQ
作用:
- 异步处理: 异步处理业务, 快速响应
- 应用解耦: 多个应用之间互相解耦, 相互依赖减少
- 流量控制: 流量削峰, 减少大并发情况下的用户请求,起到为服务器缓冲的作用
概念:
publicsher: 生产者
- 发送消息
Message: 消息
- 消息本身分为: 消息头+ 消息体 +route_key
Exchange: 交换机
- 接受消息, 与队列进行绑定(Binding),
- 交换机根据 与队列之间的绑定关系确定路由键(route_key), 进行存储
Queue: 消息队列
- 存储消息
Consumer: 消费者
- 消费消息,
VHost: 虚拟主机 包含交换机和队列
- 用于隔离不同平台和语言, 每个虚拟主机之间互不影响,
备注:
- 生产者消费者 先与队列建立连接(Connection),在连接中使用通道(Channel)进行消息的发送和消费,每个应用只需建立一个连接即可,所有其他消息的操作全部使用通道完成
队列形式:
-
点对点模式:
- 消息发送者准备消息指定一个队列,并放入队列, 消息消费者从指定队列中获取消息消费
-
发布订阅模式:
- 发送者把消息放入主题, 所有订阅主题的消费者都会监听到消息并消费, 点对点是一个消息只能被一个消费者消费
-
区别:
- 相同: 都可以有多个发送者和消费者,
- 不同: 点对点中队列的消息一个消息只能被一个消费者消费,而订阅模式, 所有监听相同主题的消费者都能消费
协议标准:
- JMS(Java Message Service): java api
- 不跨语言, 不跨平台
- 两种消息模型
- 多种消息类型 text map bytes stream object
- AMQP(Advanced Message Queuing Protocol): 网络线级协议
- 跨语言,平台
- 五种消息模型
- 一种消息类型 byte[]
- 当全平台使用Java语言开发时可以使用JMS, 有其他语言时,可以使用AMQP
Docker 安装abbitMQ
docker run -d
--name rabbitmq
-p 5671:5671 AMQP端口
-p 5672:5672 AMQP端口
-p 4369:4369 Erlang端口
-p 25672:25672 Erlang端口
-p 15671:15671
-p 15672:15672 web管理后台端口
rabbitmq:3-management 镜像名称
docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:3-management
后台管理系统默认用户名密码 guest guest
交换机类型(exchange)
- direct: 直接交换机
- route_key根据绑定关系(Banding)精确匹配,
- fanout: 广播发布订阅交换机
- 把消息广播到所有与当前交换机有绑定关系的队列
- topic: 主题发布订阅交换机
- 交换机通过路由键(route_key) 对队列绑定的匹配模式进行对比, 符合匹配的获取消息
- 使用. 对路由键和绑定键进行隔离, 使用通配符进行对比: ‘#’ 匹配0 或多个单词 ,’ * '匹配一个单词
- headers: 性能较低, 不经常使用