参考链接
好处
- 通过 异步处理 提高系统性能(削峰、减少响应所需时间)
- 将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务
- 降低系统耦合性
问题
- 系统可用性降低: 系统可用性在某种程度上降低
- 系统复杂性提高: 加入MQ之后需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题
- 一致性问题:如果消息的真正消费者并没有正确消费消息就会导致数据不一致的情况
常用场景
- 削峰
- 例如:考试系统中,用户通过人脸识别登录系统,考虑到考试系统的特殊性,三万名考生参加考试,需要记录人脸识别登录照片。从考试完结果上看,用户最大并发数在4000,于是我们采用rocketMq来进行异步消费用户人脸识别图片,当时统计rocketMq每秒1000消费消息。及时反馈了考生人脸识别登录成功,对数据库写操作也起到很大的缓冲功能
- 解耦
- 例如:常用ABCD系统中,BCD系统都需要从A系统中调用接口返回数据,这时候突然来了E系统,也需要A系统数,又或者C系统不想要用这个接口数据了,而且A系统还得考虑,如果BCD接收不到数据,接收失败咋整之类的问题
- 如果基于消息队列,这些问题就迎刃而解了
- A系统直接把数据扔到Mq中,BCDE系统直接从Mq中消费,如果消费失败,则重试消费
- 异步
- 例如:下订单系统中,会调用库存系统,会调用仓库系统,积分系统等,用户订单操作会直接返回给用户信息,提示订单完成,至于库存减少,或者仓库发货又或者积分的增加等,都是异步完成。极大的提高用户响应速度
各种消息队列优缺点
rabbitMq
- rabbitMq 几万级数据量,基于erlang语言开发,因此 响应速度快些,并且社区活跃度比较活跃,可视化界面
- 缺点就是数据吞吐量相对与小一些,并且是基于erlang语言开发,比较重的问题难以维护
rocketMq
- rocketMq几十万级别数据量,基于Java开发,应对了淘宝双十一考验,并且文档十分的完善,拥有一些其他消息队列不具备的高级特性,如定时推送,其他消息队列是延迟推送,如rabbitMq通过设置expire字段设置延迟推送时间。又比如rocketmq实现分布式事务,比较可靠的