本文共 1165 字,大约阅读时间需要 3 分钟。
什么是消息队列
- 英文全称Message Queue,简称MQ
- MQ是一个单独的服务(单独部署跑在某台电脑上)
- 使用队列这种数据结构进行存储数据
- 简单来说就是一种数据的容器,使用队列这种数据结构进行存储
- 把数据放在MQ中被称之为生产者
- 把数据从MQ中拿走称之为消费者
MQ的诞生历程
- 1983年在麻省理工一个印度人开发了第一个MQ叫TIB(开了家公司),此时的TIB多用于金融行业
- 1994年路透社收购了TIB的公司
- IBM研发了自己的MQ
- 微软研发了自己的MQ
- 2001年SUN公司出台了JMS规范(JMS规范只适用于Java)
- 2006出现了AMQP(Advanced Message Queuing Protocol)协议
- 2007年有公司基于AMQP协议开发了RabbitMQ的第一个版本(RabbitMQ使用Erlang语言编写)
为什么使用MQ(使用场景)
- 异步处理
- 架构解耦
- 削峰填谷/流量削峰
异步处理
比如有如下注册服务:
当前系统存在的两个问题:
用户体验问题:当前系统只有在加积分完毕后才通知用户注册完毕。如果使用异步那么可以做到先通知用户注册成功然后在加积分。
性能问题:当前系统需要60ms完成操作,但是异步调用可能只需要30ms。
系统解耦
在说系统解耦之前先了解下什么是耦合,耦合是系统内部或者系统之间存在相互作用,相互影响和相互依赖。
在分布式系统中,一个业务可能是由多个系统完成的(比如说电商的退货)

改变订单状态——>增加库存——>退钱——>通知退货成功。这是退货的流程,但是这些流程本质上顺序并不重要,也就是依赖关系并不强,如果引入MQ完全可以做到先通知在增加库存修改订单状态等操作,还可以做到增加库存失败等操作不影响其他操作。
引入MQ后系统架构如下:

这样的各个系统只要维护自己系统与MQ的关系即可,不需要关系其他系统如何,比如说如果通知系统挂了也完全不会影响到支付系统退钱。
流量削峰
在很多电商系统中,会有一个请求非常高的情况比如说京东的618,淘宝的双11。普通的服务器肯定是无法承载这么高的流量,如果通过加服务器的方式来解决问题,那么在活动过后会造成硬件浪费的情况。
为了解决这个问题我们可以使用MQ将流量全部承接下来,然后让各个子系统慢慢进行处理。
总结使用场景
- 对于数据量大或者处理耗时长或非重点业务的操作,我们可以引入 MQ 实现异步通信,减少客户端的等待,提升响应速度。
- 对于改动影响大的系统之间,可以引入 MQ 实现解耦,减少系统之间的直接依 赖。
- 对于会出现瞬间的流量峰值的系统,我们可以引入 MQ 实现流量削峰,达到保 护应用和数据库的目的。
主流的消息队列对比
使用消息队列带来的问题
- 数据丢失问题
- 数据重复问题
- 如何保证消息顺序性
- 如何保证一致性
- MQ高可用问题等
转载地址:http://xipgz.baihongyu.com/