概念
MQ,英文全拼为message queue,直译为消息队列,是应用程序和应用程序的通信方式
基础数据结构是先进先出队列
MQ用于解决微服务之间出现问题的工具
- QPS(Queries-per-second):每秒查询率,即服务器对数据的吞吐量(并发量/响应时间)
- PV(PageView):页面浏览量,
- uv(unique visitor):不同ip,不同人的访问数
- PR(PageRank):页面的级别技术,表示跳转到这个页面的次数,次数越高越受欢迎
RabbitMQ是基于erlang语言开发,基于AMQP(Advanced Message Queue高级消息队列协议),是一个应用层的网络协议,为面向消息中间件设计。
基于此协议的客户端与消息中间件可传递消息,并不受客户端、中间件、开发语言等不同条件限制
RabbitMQ提供了六种模式:简单模式、work模式、Publish/Subscribe发布与订阅模式、
Routing路由模式、Topics主题模式、RPC远程调用模式
- 简单模式:生产者将消息加入队列,等待消费者获取
- 工作模式:生产者将消息加入队列,由多个消费者共同消费
- 多余任务重的情况下,可以提高任务处理速度,减少消费者处理压力
- 发布与订阅模式:生产者将消息发送给broker,由交换机转发给每个多列
- 在多个消费者需要相同消息的情况下,可以让交换机分发消息
- 路由模式:生产者将消息发送给broker,交换机根据规则给队列消息
- 根据需求给消费者队列需要的消息
- 通配符模式:与路由模式类似,但更加灵活
- 并行处理:用户注册->服务器处理->发送邮件->发送短信
- (速度慢)
- 并行方式:用户注册->写入服处理->发送邮件短信
- 速度快但增加服务器压力
- 消息队列:用户注册->写入服处理->中间件->发送邮件短信
- 减少服务器不必要的操作,略慢于并行
解耦服务
以电商为例,应用有订单系统、库存系统、物理系统、支付系统。 用户在创建订单时,任何子系统发生故障都会照成下单异常 转变为基于消息队列的方式后,当某个系统发生异常时, 要处理的数据会缓存在消息队列中,系统恢复后正常处理,用户感觉不到某系统出现的故障 提升系统的可用性,系统之间建立连接点在连接问题上直接修改中间件无需对系统内部做修改
流量削峰
在秒杀活动中,进行锁定库存,库存校验
在订单上限后对多余的请求拒绝处理,并打包请求统一发送给服务器,减少服务器的负荷
缺点
- 系统复杂性增加:新增了MQ使系统更加复杂,也给开发人员带来学习成本
-
JMS和AMQP
MQ消息队列模型实现了两种主流方法:
AMQP(链接协议),AMQP不能从API层进行限定,而是直接定义网络交换数据格式
- JMS(JavaMessage Service)java消息服务,java面向消息中间件的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信
区别:
- JMS定义统一接口,操作统一。AMQP通过规定协议统一数据交互格式
- JMS限定必须使用java。AMQP是协定,不规定实现方式 ,可跨语言
- JMS规定两种消息模式;AMQP消息模式丰富