消息队列MQ描述
消息队列(Message Queue)简称 MQ 指保存消息的一个容器,本质上是一个容器
消息(Message)是指在应用之间传送的数据,消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。
下图便是消息队列的基本模板,向消息队列中存放数据的叫做生产者,从消息队列中获取数据的叫消费者。
消息队列的MQ的应用场景
1.异步处理
消息队列的主要特点是异步处理,主要目的是减少请求响应时间,实现非核心流程异步化,提高系统相应性能。
1)同步
同步的总耗时:10ms+100ms+100ms=210ms 相当于用户需要等待增加积分这步完成才可以返回用户注册成功,或者失败
由于短信通知与增加积分为非核心流程,为了提升系统相应性能,从而我把它改早为异步
2)异步
改造成就变成上图,之前需要等用户注册10ms+短信通知100ms+增加积分100ms才能返回,
现在把短信通知和增加积分改为异步的形式,用户注册后写入消息10ms左右立即成功返回客户端,无需等待耗时较久的同步(短信+积分)就可以返回,从而极大的提升了系统的吞吐量。
所以异步的经典场景就是将比较耗时而且不需要同步返回结果的操作,通过消息队列来实现异步化
当前异步发送MQ还有其他的场景:cf领取神话装备,发送邮箱,qq飞车领取跑车 只要不是非核心业就可以使用
当前还有不能使用异步发送MQ的场景:比如支付,删除用户信息,修改用户信息等一系列操作
2 应用解耦
使用了消息队列后,只要保证消息格式不变,消息的发送方和接收方不需要彼此联系,也不需要受对应的影响,即解耦
每个成员不必受其他成员影响,可以更独立自出,只通过消息队列MQ联系,典型的上下游解耦如下图所示
比如这个12306买票系统,库存系统,邮件系统 都需要订单系统的数据,假如这时候需要第三方客户端也需要订单系统,这时候就需要在订单系统上添加代码,如果过段时间加了短信系统,这时候也要在订单系统添加代码。又过一段时间,假如不需要邮件系统,还要在订单系统操作。订单系统代码会一直来回频繁修改。
如果使用异步解耦
只需要把消息发布到MQ中,然后其他系统需要消息进行拉取就可以了。就算增加一个新的系统也不会影响什么。消息都是MQ提供的
3.流量削峰
流量削峰也是消息队列中的常用场景,一般在秒杀,团购,双11 活动中使用广泛
这种场景中系统的峰值流量往往其中于一小段时间内,所以为了防止系统在短时间内的峰值流量冲垮,往往采用消息队列来削弱峰值流量,相当于消息队列做来一次缓冲
使用了mq
MQ的优势,主要提现在三个方面
1. 应用解耦:提高系统容错性和可维护性
2. 异步提速:提升相应速度,优化用户体验
3. 削峰天谷:高并发的时候,可以有效保证系统的稳定性
也有弊端
1 复杂度提高,我们需要解决消息丢失,积压,幂等各种情况
2 一旦mq宕机,对业务有影响
常见的MQ性能对比
这里从网上找的一张性能对比图,可以大概对比一下几大主流MQ的优缺点。ActiveMQ因为吞吐量低,也没有什么突出的优势,用的人也少了。RabbitMQ主要特点是消息延迟低,并发能力强,而且安全可靠,所以并发量不是很大的金融行业据说用的多,互联网公司可能用的少,因为他的开发语言是Erlang,可能懂得人不多,出问题不好定位。而RocketMQ是阿里开源的MQ,并发高,功能多,用的好像挺多。Kafka主要用在大数据领域。这些话呢,也主要是网上看的,并没有实际调研过,有确切的数据,不过理论上是可信的。