RabbbitMQ
安装
·
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management
docker run -d --hostname my-rabbit --name rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=qwer1234 -p 15672:15672 -p 5672:5672 rabbitmq:management
docker exec -it rabbitmq rabbitmq-plugins enable rabbitmq_management
·
基本介绍
- publlisher:消息发送者
- consumer:消息的消费者
- queue:队列,存储消息
- exchange:交换机,负责路由消息,和转发,没有存储功能
- virtual-host:虚拟主机
数据隔离
- 虚拟主机
- 自己创建虚拟主机,自己去创建虚拟主机 就是被隔离开来,自己就是存在自己的虚拟主机了
配置能者多劳 work模型
- prefetch:1 配置能者多劳,每次取出一条消息,处理完成才能获取下一个消息
- 如何处理消息堆积问题:绑定多个消费者,加快消息处理的速度,优化自己的业务代码,缓存,异步等等。
- 可以在一个队列上绑定多个消费者
- 怎么处理消息堆积?使用多个消费者,优化代码
Fanout交换机
-
Fanout:广播
-
Direct:定向
-
Topic:话题
-
Fanout交换机会将接收到的数据广播到每一个queue,所以可以叫广播模式
-
取名创建队列:fanout.queue1
Direct交换机
- 会根据一定的规则路由到指定的Queue
- 队列绑定BindingKye
- 发布者指定消息的RoutingKey
Topic交换机
- 和direct交换机很像,不过可以匹配多个的
队列和交换机的声明
- 可以使用代码去创建queue交换机
消息转换器
- 发送一个对象类型的
高级篇
可靠性问题
发送者可靠性
- 生产者重连
- 生产者确认
- correlated:就是需要编写回调函数
MQ端消息丢失
- 数据持久化
- 交换机持久化 durable
- LazyQuene:接收到消息直接写入磁盘,所有的版本都是lazyQuene
- pageout 直接写入磁盘
消费者端数据安全
- 消费者确认机制
- 消费者主动去告诉mq 消息处理成功
消息的失败处理策略
- 当数据出现问题,不告诉mq 而是在本地无限的去重试,记录当前的业务的状态
- 重试多次依旧失败 处理-直接拒绝,重新入队,重新发送消息(消息处理失败,发送到指定的交换机)
业务的幂等性
- 一个消息会被处理多次 消费者重复消费,业务要做到幂等性
- 如何保证业务的幂等性---使用令牌的方式来执行表单的提交,就能判断表单是否重复提交,给消息加上一个消息的唯一id
- 解决方案:判断id
- 基于业务逻辑的判断,修改状态,直接在业务上把数据处理,where id = 1
- 删除操作不存在幂等性
延迟消息
- 生产者发送会指定一个时间,指定时间之后消费者就是回去处理
- 支付超时时间,(可以使用定时任务去处理,当然现在也是可以使用rabbitmq,延迟消息)
- 下单后不付款,然后让这个30分钟去处理这个业务,然后就可以实现业务的实现,使用延时消息就可以解决
死信交换机
只要满足其中之一个条件
延时消息插件
- 对交换机进行改造,就会存储时间
- 安装插件
- 然后去使用