MQ学习整理

MQ学习整理

微服务间同步调用

例子:微服务基于feign调用
问题:
1.耦合度高(每次新需求需要修改原来的代码)
2.性能下降,吞吐量下降 (调用链长,时间长)
3.系统资源地浪费 (调用链在响应的过程中不释放占用的资源)
4.级联失败(调用一个挂了,其他的也会阻塞,导致整个集群故障)

在这里插入图片描述

微服务间异步调用

实现:事件驱动模式
优点
1.服务解耦(无需在支付服务里面加代码,无需调用,只是发布事件)
2.性能提升,吞吐量提高(支付服务时间+发布事件时间,不掉用,不等待)
3.故障隔离:服务没有强依赖,不必担心级联失败,不掉用,不等待,只是让broker代理发布,其他微服务订阅即可。
4. 流量削峰

缺点
依赖broker的可靠性,安全性,吞吐能力
架构复杂,不好追踪

在这里插入图片描述

MQ(MessageQueue)

是什么:是存放消息的队列,是事件驱动架构的Broker
种类
RabbitMQ(消息延迟低,微秒级,可靠性高),
ActiveMQ(吞吐量差),
RocketMQ(可靠性高),
Kafka(高吞吐量,低可靠性)
常见消息模型
基本消息队列,工作消息队列
在这里插入图片描述
Publisher:发布消息(需要编写代码)
Queue:接受缓存消息(rabbitMQ实现)
Consumer:订阅处理消息(需要编写代码)

发布订阅

根据交换机类型分3类:广播Fanout,路由Direct,主题Topic
RabbitMQ:
基本消息队列发送消息
1.建立连接connection
2.创建通道channel
3.利用channel声明队列
4.利用channel向队列发送消息
基本消息队列接收消息
1.建立连接connection
2.创建通道channel
3.利用channel声明队列(防止队列不存在)
4.定义consumer的消费行为handleDelivery()回调函数
5.利用channel绑定消费者与队列
在这里插入图片描述

AMQP

AMQP(Advanced Message Queuing Protocol)传递消息开放标准,协议与语言和平台无关
Spring AMQP:spring基于协议定义的api规范,提供模板发送和接收消息。Spring-amqp基础,spring-rabbit底层默认实现
使用
利用RabbitMQ发送消息:
1.引入amqp的依赖
2.配置RabbitMQ的地址
3.使用模板发送,利用RabbitTemplate的concertAndSend方法只需要指定队列名称和消息内容即可
利用RabbitMQ接收消息:
1. 引入amqp的依赖
2. 配置RabbitMQ的地址
3. 监听队列,接收处理消息 @Compent让spring找到这个类,@RabbitListener监听队列
特点:阅后即焚,发完消息不能回溯

Work Queue工作队列

Work Queue工作队列
解决问题:一个发消息的,多个消费消息的,即一个队列绑定多个消费者,提高消息处理速度,避免消息队列堆积,超过消息队列堆积上限就会丢弃消息。合作消费消息
消息预取:由于消息预取机制,队列中的消息会将消息平分给每个消费者而不考虑消费能力,导致整个消费时间超出预期,可以在yml中设置preFetch的值,控制消息预取的上限,能实现能者多劳。
在这里插入图片描述

SpringAMQP的发布订阅

SpringAMQP的发布订阅(广播Fanout,路由Direct,话题Topic)
与之前的基本消息队列,工作消费队列的区别是加入了exchange交换机
exchange交换机负责消息的路由,而不是存储,路由失败则消息丢失

发布订阅-Fanout Exchange

发布订阅-Fanout Exchange 将接收到的消息路由到每一个跟其绑定的queue
使用:声明交换机和队列将其绑定
消费者:声明队列(Queue),交换机(FanoutExchange),绑定关系(Binding)的bean
在这里插入图片描述
发送者:
在这里插入图片描述

发布订阅-Direct Exchange

根据规则路由到指定的Queue,每个Queue都和Exchange设置一个BindingKey
需要绑定key,发消息时也要指定key
使用:
1.Consumer消费者进行路由绑定,使用注解@RabbitListener
在这里插入图片描述
2.发消息者测试:
在这里插入图片描述
Fanout交换机 VS Direct交换机
Fanout将消息发送给每一个和它绑定的队列,Direct根据RoutingKey发送给对应绑定的队列。

TopicExchange主题交换机

区别于路由交换机的是,必须是多个单词列表,并且以点分割(如:china.news)
Queue与Exchange指定BindingKey时可以使用通配符:#代指一个或多个单词,*代指一个单词
使用:
1. 消费者绑定交换机,主题,用于消费消息
在这里插入图片描述
2. 发消息者测试:
在这里插入图片描述

消息转换器

消息转换器:默认实现是SimpleMessageConvert,基于JDK的ObjectOutPutStream完成序列化,可以使用json方式实现序列化,可读性好。引入依赖,定义一个MessageConvert类型的Bean.消息发送者和接收者都需要
在这里插入图片描述

数据库连接资源很宝贵,要快速用,快速释放
RocketMq无需等待消息发送成功;发送数据使用半消息的状态,成功,消费者可以消费,失败,mq服务器删除此消息;mq服务器会定时向生产者做数据的回查

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值