前言
安装
# docker run 方式
docker run -d -p 15672:15672 -p 5672:5672 --name app_rabbitmq --network app -e RABBITMQ_DEFAULT_USER = admin -e RABBITMQ_DEFAULT_PASS = nieao0823.. -e RABBITMQ_DEFAULT_VHOST = app_host --restart = always -v /usr/local/docker/app/rabbitmq/data:/usr/lib/rabbitmq rabbitmq:3.7.15
# docker-compose.yml
rabbitmq:
container_name: "app_rabbitmq"
image: "rabbitmq:3.7.15"
networks:
- app
ports:
- "5672:5672"
- "15672:15672"
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS}
RABBITMQ_DEFAULT_VHOST: ${RABBITMQ_DEFAULT_VHOST}
volumes:
- "/usr/local/docker/app/rabbitmq/data:/usr/lib/rabbitmq"
# .env
RABBITMQ_DEFAULT_USER=admin
RABBITMQ_DEFAULT_PASS=123456
RABBITMQ_DEFAULT_VHOST=app_host
# Rabbitmq Management
docker exec -it app_rabbitmq bash
- rabbitmq-plugins enable rabbitmq_management # 进入容器内部执行此命令开启rabbitmq控制页面
理论概念
MQ(Message Queue)本质上是一个队列,FIFO先进先出,队列中存放的是Message消息,是一种跨进程的通信机制,用于上下游传递消息,实现逻辑解耦,物理解耦的通信服务,能够实现流量削峰,系统应用间的解耦。
RabbitMQ特点
- 可靠性:通过支持消息持久化,支持事务,支持消费端和传输的ack等来确保消息可靠性。
- 路由机制:支持主流的订阅消费模式,如广播,订阅,headers,路由匹配等。
- 扩展性:多个RabbitMQ节点可以组成一个集群,也可以根据实际业务情况动态的扩展集群中的节点。
- 高可用性:队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下仍然可用。
- 多种协议:RabbitMQ除了支持原生的AMQP协议,还支持STOMP,MQTT等多种消息中间件协议。
- 多语言客户端:RabbitMQ几乎支持所有常用的语言,比如Java,Python,C,PHP等。
- 管理界面:RabbitMQ提供了简易且丰富的用户界面,使得用户可以监控和管理消息,集群中节点等。
- 插件机制:提了许多的插件,以实现从多方面进行扩展,也可以自定义编写插件。
MQ的选择
ActiveMQ
:单机吞吐量过万,时效性ms级别,可用性高,消息可靠,较低的概率丢失数据;框架维护较少、高吞吐量场景较少使用Kafka
:大数据而生,百万级TPS的吞吐量,在大数据日志采集被大规模使用;消息失败不支持重试、社区更新较慢RocketMQ
:单机吞吐量十万级,可用性非常高,分布式架构,支持10亿级别的消息堆积,Java语言;支持的客户端语言不多RabbitMQ
:单机吞吐量万级别,基于AMQP(高级消息队列协议)基础上完成,可复用的企业消息系统,支持多种语言,社区活跃;商业收费,学习成本高
RabbitMQ概念名词
Connection
连接 Channel
通道 Queue
队列 Exchange
交换机 Virtual host
虚拟主机
Broker
表示就是RabbitMQ消息中间件服务;
Virtual host
相当于namespace概念,多用户使用时,可以划分出多个vhost,实现数据的隔离性;(数据库中库的理念)
Channel
生产者与消费者频繁的创建与关闭Connection会浪费系统资源开销,Channel是在Connection内部建立的逻辑链接,Channel之间是完全隔离的;
Exchange交换机定义
Exchange交换机主要负责根据不同的分发规则将消息分发到不同的Queue中,供订阅了相关Queue的消费者消费到指定的消息。Producer生产者在向Exchange发送一条消息的时候,必须指定Routing Key(路由键),然后Exchange接收到这条消息后,会解析Routing Key然后根据Exchange与Queue的绑定规则(Binding Key)将消息分发至符合规则的Queue中。
direct
:直接策略 ,Routing Key路由键与Binding Key绑定路由键相同,才会分发消息;fanout
:扇形策略,广播发送;所有与Exchange绑定的Queue都会收到消息,不关心RoutingKey;topic
:主题策略, Topic类型的Exchange会对Routing Key进行匹配,只要满足某个通配符的条件就会分发至对应的Queue上。- Routing Key必须是一串字符串,每个单词通过"."分隔;
- 符号"#"表示匹配一个或者多个字符;
- 符号"*"表示匹配一个单词。
headers
:头部策略, 与主题交换机类似,只不过headers的Exchange与Queue之间的绑定不再通过Binding Key绑定,而是通过头部Arguments绑定,主题交换的rounting key只能是字符串而headers可以是哈希值和整型;
RabbitMQ问题
- 持久化
- 事务机制
- 消息确认机制
- 延迟队列
- 死信队列
- 集群