消息队列的使用场景
消息队列的做用主要有三个解耦、异步、削峰sql
解耦
B,C,D 系统须要使用 A 系统产生的关键数据。 无消息队列时系统 A 为系统 B、C、D 等提供各自的接口,致使系统 A 与它们紧密耦合添加系统 E 又须要接口,删除 B 系统原接口又没用了 有消息队列时系统 A 做为生产者,将消息发送到消息队列系统 B、C、D 做为消费者订阅消息新增消费者只需订阅消息,对原系统和业务没有影响
异步
用户请求数据时,系统的响应时间是保证用户体验很重要的一部分。 无消息队列时用户请求 A 系统,A 系统须要等待 BCD 执行完成以后响应用户收到响应用时近 1 秒 用消息队列时用户请求 A 系统,A 系统将请求推到消息队列中,B、C、D 异步执行用户收到响应用时 200 毫秒
肖锋
秒杀场景下,每秒有 5000 个请求,Mysql 每秒最大处理 2000 条 sql。 无消息队列时用户请求数据直接写入数据库,高并发时数据库压力剧增,甚至奔溃Mysql 宕机,整个系统都不能用了 有消息队列时系统 B、C、D用户请求数据先存入 MQ 中系统 A 每秒读取 2000 条数据进行处理每秒多出 3000 条未处理数据按场景稍后处理
消息队列有什么缺点
系统可用性下降数据库
- 系统引入的外部依赖越多,宕机的可能性就越大
- 系统引入消息队列,就要考虑消息队列的可靠性
- 好比本来只须要考虑 A,B,C,D 四个系统
- 引入消息队列以后就须要考虑 A,B,C,D 四个系统外加消息队列
系统复杂度提升并发
- 消息重复消费问题
- 消息丢失问题
- 消息传递顺序问题
一致性问题异步
- A 系统处理完返回成功,即认为请求成功
- 可是也存在 BC 系统写入成功,而 D 系统写入失败的状况
- 这样的状况就是数据不一致