阅读 120

消息队列经典面试问题(一)

常见面试问题

  • 你的项目中是怎样使用消息队列的?
  • 为什么要使用消息队列?
  • 使用了消息队列会有哪些问题?

引入消息队列的好处

消息队列我们可以理解为消息传输中存放消息的容器,当我们需要的时候可以取出供我们自己使用,把数据放入到消息队列的叫做生产者,从消息队列中取出数据的叫做消费者,为什么使用消息队列呢?因为它主要有异步、解耦、削峰这几个好处,下面我们来一起看下这几个场景。

  • 异步

通过上图我们可以看到当我们使用消息队列来异步处理能提高系统性能减少响应时间。

  • 解耦
    通过上图我们可以知道通过消息队列实现事件驱动结构,能很好实现系统解耦,消费者根本不需要关心消息从何处而来,只需去消息队列取即可,如上图如果应用程序A完成后,还需要做E这么一件事,那增加一个消费者E即可,而不需要改动A的业务代码。
  • 削峰

拿上面异步那副图来说,当某个时候大量的请求过来,例如秒杀活动,在这种高并发的情况下你的数据库压力肯定剧增,那使用了消息队列其实是将高并发请求进行了一个缓冲,用户的请求数据发送给消息队列之后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库,这样消息队列其实是可以起到一个削峰的作用。

引入消息队列带来的问题

说完了消息队列的好处,我们来聊一聊引入消息队列会带来哪些问题呢?

  • 系统可用性降低

引入消息队列,也意味带来风险,如果你的mq挂了,那将有可能导致整个系统崩溃,所以怎么保证mq高可以是必须要考虑的问题。

  • 系统复杂性提高

引入消息队列是有可能带来很多问题的,例如重复消费、消息丢失、消息顺序性、消息堆积等等一大堆问题,这些都是你需要考虑的,它大大提高了系统的复杂性。

  • 数据一致性问题

数据一致性问题它是分布式服务本身就存在的一个问题,不仅仅是消息队列的问题,只不过在消息队列里显得比较严重一点,例如生产者a处理完直接返回成功了,bcd三个消费者其bc写入数据库成功,d写入数据库失败,那这不就造成了数据不一致的问题。

应用场景

消息队列的应用场景很多,这得根据具体的业务场景,但都离不开上述哪几种好处,这里我只列举一下项目中典型的常见应用几个例子,当然也不一定每个公司都这么做。

1、注册后需要发送邮件和短信

2、日志处理(kafka)

3、秒杀活动流量削峰

4、活动发送全员通知