消息队列--灵魂拷问(1)

消息队列的使用场景

消息队列的做用主要有三个解耦、异步、削峰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 系统写入失败的状况
  • 这样的状况就是数据不一致
相关文章
相关标签/搜索