为什么使用消息中间件
- 中间件:是提供软件和软件之间连接的软件,以便于软件各部件之间的沟通;
异步直接调用的问题
业务调用链过长,用户等待时间长部分组件故障会瘫痪整个业务;业务高峰期没有缓冲;- 业务高峰期时产生大量的异步线程,造成线程池不够用或者内存饱满;!!!
使用消息中间件的优势
- 业务调用链短,用户等待时间短;
- 部分组件故障不会瘫痪整个业务;
- 业务高峰期有缓冲;
- 业务高峰期不会产生大量的异步线程;
使用消息中间件的作用
- 异步处理;
- 系统解耦;
- 流量削峰和流控;
- 消息广播;
- 消息收集;
- 最终一致性;
中间件介绍
- ActiveMQ
- RabbitMQ
- 高可靠性,支持发送确认、投递确认等特性;
- 高可用,支持镜像队列;
- 支持插件;
- RocketMQ
- Kafka
RabbitMQ高性能的原因
- RabbitMQ底层使用ErLang实现,天生具有高性能的基因;
AMQP协议介绍
Broker
: 接收和分发消息的应用,RabbitMQ就是Message Broker;Virtual Host
: 虚拟Broker,将多个单元隔离开;Connection
: publisher/consumer 和broker之间的TCP连接;Channel
:connection内部建立的逻辑连接,通常每个线程创建单独的channel;Routing Key
: 路由键,用来指示消息的路由转发,相当于快递的地址;Exchange
: 交换机,相当于快递的分拨中心;Queue
: 消息队列,消息最终被送到这里等待consumer取走;Binding
: exchange和queue之间的虚拟连接,用于message的分发依据;
核心概念–Exchange
- 在AMQP协议或者是在RabbitMQ实现中,最核心的组件是Exchange;
- Exchange承担RabbitMQ的核心功能——路由转发;
- Exchange有多个种类,配置多变,需要详细学习;
- Exchange的功能是根据
绑定关系
和路由键
为消息提供路由,将消息转发至相应的队列; - Exchange有4中类型:Ditrect、Topic、Fanout、Headers,其中Headers使用很少,以前三种为主;
Direct Exchange
Message中的Routing Key如果和Binding Key一致,Direct Exchange则将message发到对应的queue中;
Fanout Exchange
每个发到Fanout Exchange的 message都会分发到所有绑定的queue上去;
Topic Exchange
- 根据Routing Key及通配规则,Topic Exchange将消息分发到目标Queue中;
- 全匹配:与Direct类似;
- Binding Key中的
#
: 匹配任意个数的word; - Binding Key中的
*
: 匹配任意1个word;
总结
- AMQP协议直接决定了RabbitMQ的内部结构和外部行为;
- 对于发送者来说,将消息发给特定的Exchange;
- 消息经过Exchange路由之后,到达具体的队列;
- 消费者将消息从监听的队列中取走;
- Exchange主要有三种类型:Direct/Topic/Fanout;
- Direct(直接路由)
- Fanout(广播路由)
- Topic(话题路由)
RabbitMQ安装
直接docker命令安装
docker run -d -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
网页端管理工具介绍
- RabbitMQ网页端管理工具也叫管理控制台、管控台;
- 管理控制台是RabbitMQ最常用的管理、配置工具;
- 管理控制台对于业务的开发、调试也非常有用;
启用前端插件
- docker命令进入容器内部
docker exec -it rabbitmq bash
- 启动应用:
rabbitmq-plugins enable rabbitmq_web_stomp
- 浏览器打开:
127.0.0.1:15672
- 默认用户名:guest,密码:guest;
命令行工具上手
- 生产环境、端口限制等不变打开网页端工具;
- 使用脚本自动化配置Rabbitmq;
口诀
- 想看什么就list什么;
- 想清空什么就purge什么;
- 想删除什么就Delete什么;
- 一切问题使用 --help
状态查看
- 查看状态:
rabbitmqctl status
- 查看绑定
rabbitmqctl list_bindings
- 查看channel
rabbitmq list_channels
- 查看connection
rabbitmq list_connections
- 查看消费者
rabbitmqctl list_consumers
- 查看交换机
rabbitmqctl list_exchanges
队列相关
- 查看队列
rabbitmqctl list_queues
- 删除队列
rabbitmqctl delete_queue XXX
- 情况队列
rabbitmqctl purge_queue
用户相关
应用启停
- 启动应用: rabbitmqctl start_app;
- 关闭应用:rabbitmqctl stop_app,保留Erlang虚拟机;
- 关闭应用: rabbitmqctl stop,并关闭虚拟机;
集群相关
- 加入集群: rabbitmqctl join_cluster
- 离开集群:rabbitmqctl reset
镜像队列
- 设置镜像队列:rabbitmqctl sync_queue
- 取消镜像队列:rabbitmqctl cancel_sync_queue