什么是消息队列,有哪些应用场景?
什么是消息队列,有哪些应用场景?
提示
题眼: 解耦,异步,削峰
等价于 你为什么要用消息队列?或者 你们项目的消息队列主要是干嘛的? 等等,这类问题也可以用这里的内容回答。
此处的 消息队列,有别于我们在操作系统中学习的,进程通信里用到的消息队列,通常是指服务之间的消息中间件,它本身是一种存储,本质上在服务架构中扮演的角色和 MySQL 没有什么区别,理论上讲,消息队列能做到的事情,MySQL 和 Redis 也能做,只是不专业而已。这一点很容易被忽略,导致很多初级工程师会认为用到消息队列,技术就会很高级,业务就会很复杂。我们在学习时,一定要破除这种迷信。
重要
参考答案:
消息队列是一种存储中间件,它本质上就是一个生产-消费者模型,比较常用的我了解过有三种, RocketMQ(火箭),RabbitMQ(兔子)和 Kafka(卡夫卡),我们公司平常用的比较多的是这个卡夫卡。
消息队列的作用主要有三个,解耦、异步和削峰。解耦的话,比较好理解,也是我们最常用的一种方式。比如说我们系统里,用户,订单等等这些模块以前都是组合在一起的,然后彼此之间调接口的方式同步数据,这样子的话,如果一边服务有问题,会出现数据丢失。换成消息队列的话,双方就不在互相依赖了,如果一方有问题,消息会暂时保存,只要及时恢复,就不会有问题。
异步的话,我也有用过,它主要是将较长的业务流程拆成异步的,这样可以降低用户等待时间。比如说我们的投票服务,因为它的业务特殊性,用户需要在一段时间内投票然后返回结果。我们之前的话,走权限验证,计票,然后同步数据等,流程很长,用户点完投票要等一会才能看到结果。所以,我们就用消息对了把这个同步操作,改成了异步,只需要走权限验证,然后写一条投票记录就可以返回了,页面直接在原有数据上加 1 就行了。这样用户体验会好很多。还有一种异步,是我觉得用的最多的,通过消息队列接收 MySQL 的 Binlog 数据,当出现更新操作的时候,异步刷新缓存。
削峰填谷的话,一般都是为了保护后端服务或者存储,比如说我们的订单服务的数据库最大 QPS 只有 2K,但是我们服务的 QPS 峰值能有 5K,这种情况下,就可以用消息队里,先把业务流程拆成异步操作,然后控制消费端的速率,保证 QPS 在 2K 一下,这样子就相当于把 2 秒的 1W 请求,拆到 5 秒里。
虽然消息队列作用很多,但是问题也很多。引入一个模块,会多很多运维问题,如果存储中间件,或者消费端出问题,容易出现数据丢失,或者消息堆积的问题。
相关信息
引申: 这三种消息队列有什么区别。
