什么是MQ消息中间件
全称MessageQueue,主要是⽤于程序和程序直接通信,异步+解耦
应⽤场景
核⼼应⽤
解耦:订单系统-》物流系统
异步:⽤户注册-》发送邮件,初始化信息
削峰:秒杀、⽇志处理
RabbitMQ:
⽂档:www.rabbitmq.com/getstarted.…
1.多数互联⽹公司⾥⾯⽤的技术栈,可以承载海量消息处理
2.在多数互联⽹公司中,RabbitMQ占有率很⾼,且全球都很流⾏
3.在分布式系统中存储转发消息,在易⽤性、扩展性、⾼可⽤性等⽅⾯表现强劲,API丰富易⽤
4.可以作为公司内部培训技术分享必备知识,可靠性投递、消费、⾼可⽤集群等
核⼼概念, 了解了这些概念,是使⽤好RabbitMQ的基础
Broker
RabbitMQ的服务端程序,可以认为⼀个mq节点就是⼀个broker
Producer⽣产者
创建消息Message,然后发布到RabbitMQ中
Consumer消费者:
消费队列⾥⾯的消息
Message 消息
⽣产消费的内容,有消息头和消息体,也包括多个属性配置,⽐如routingKey路由键
Queue 队列
是RabbitMQ 的内部对象,⽤于存储消息,消息都只能存储在队列中
1.多数互联⽹公司⾥⾯⽤的技术栈,可以承载海量消息处理
2.在多数互联⽹公司中,RabbitMQ占有率很⾼,且全球都很流⾏
3.在分布式系统中存储转发消息,在易⽤性、扩展性、⾼可⽤性等⽅⾯表现强劲,API丰富易⽤
4.可以作为公司内部培训技术分享必备知识,可靠性投递、消费、⾼可⽤集群等Channel 信道
⼀条⽀持多路复⽤的通道,独⽴的双向数据流通道,可以发布、订阅、接收消息。
信道是建⽴在真实的TCP连接内的虚拟连接,复⽤TCP连接的通道
Connection连接
是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑,⼀个连接上可以有多个channel进⾏
通信
Exchange 交换器
⽣产者将消息发送到 Exchange,交换器将消息路由到⼀个或者多个队列中,⾥⾯有多个类型,后续
再⼀⼀介绍,队列和交换机是多对多的关系。
RoutingKey 路由键
⽣产者将消息发给交换器的时候,⼀般会指定⼀个RoutingKey,⽤来指定这个消息的路由规则
最⼤⻓度255 字节
Binding 绑定
通过绑定将交换器与队列关联起来,在绑定的时候⼀般会指定⼀个绑定键 ( BindingKey ),这样
RabbitMQ 就知道如何正确地将消息路由到队列了
⽣产者将消息发送给交换器时,需要⼀个RoutingKey,当BindingKey和 RoutingKey相匹配时,消息会被路由
到对应的队列中
Virtual host 虚拟主机
⽤于不同业务模块的逻辑隔离,⼀个Virtual Host⾥⾯可以有若⼲个Exchange和Queue,同⼀个
VirtualHost ⾥⾯不能有相同名称的Exchange或Queue
默认是 /
/dev
/test
/pro
⾼性能消息队列RabbitMQ⾼级特性
TTL死信队列
什么是TTL
time to live 消息存活时间
如果消息在存活时间内未被消费,则会被发送到死信队列
RabbitMQ⽀持两种ttl设置
单独消息进⾏配置ttl
整个队列进⾏配置ttl(居多)
什么是rabbitmq的死信队列
没有被及时消费的消息存放的队列
什么是rabbitmq的死信交换机
Dead Letter Exchange(死信交换机,缩写:DLX)当消息成为死信后,会被重新发送到另⼀个交换
机,这个交换机就是DLX死信交换机。
消息有哪⼏种情况成为死信
消费者拒收消息(basic.reject/ basic.nack),并且没有重新⼊队 requeue=false
消息在队列中未被消费,且超过队列或者消息本身的过期时间TTL(time-to-live)
队列的消息⻓度达到极限
结果:消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列
基于Linux服务器安装RabbitMQ容器化部署
登录服务器
Docker安装RabbitMQ
ssh -o ServerAliveInterval=60 root@120.25.3.72
#拉取镜像
docker pull rabbitmq:management
docker run -d --hostname rabbit_host1 --name xd_rabbit -e RABBITMQ_DEFAULT_USER=admin
-e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:3.8.9-
management
#介绍
-d 以守护进程⽅式在后台运⾏
-p 15672:15672 management 界⾯管理访问端⼝
-p 5672:5672 amqp 访问端⼝--name:指定容器名
--hostname:设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts,作为容器主机IP的
别名,并且将显示在容器的bash中
-e 参数
RABBITMQ_DEFAULT_USER ⽤户名
RABBITMQ_DEFAULT_PASS 密码