前段时间看了中华石杉老师讲解的消息队列,感受很深刻,之前也了解MQ,在工作中也会用到,但是没有进行过系统的整理和反思,当看到一些问题时,一时间真不知道怎么回答。所以在此处进行记录一下,自己也对消息队列有个深刻的认识。
面试题
- 为什么使用消息队列?
- 消息队列有什么优点和缺点?
- Kafka、ActiveMQ、RabbitMQ、RocketMQ、Pulsar不同MQ中间件有什么区别及适用场景?
- 如何保证消息队列的高可用?
- 有几百万消息持续积压几小时,你会如何处理?
- 如何解决消息队列的延时以及过期失效问题?
- 消息队列满了以后该怎么处理?
- 如果让你写一个消息队列,该如何进行架构设计?
- ······
1 为什么使用消息队列
其实是问消息队列都有哪些使用场景,然后你说一下你项目里具体是什么业务场景,有什么技术挑战,如果不用MQ就会很麻烦,,在这个场景里为什么用,解决了什么问题,有什么好处。
MQ,消息队列,消息可以理解为一个业务现场,而队列则是保存这个业务现场的容器,而B服务对消息的处理,则是一个对业务现场的异步处理。所以,消息队列的本质,就是将某个业务现场暂存下来,异步处理。异步,解耦,消峰,MQ的三大主要应用场景。
-
异步。异步就是MQ的第一个能力。可以将一些非核心流程,如日志,短信,邮件等,通过MQ的方式异步去处理。这样做的好处是缩短主流程的响应时间,提升用户体验。
-
解耦。假设现在,日志不光要插入到数据库里,还要在硬盘中增加文件类型的日志,同时,一些关键日志还要通过邮件的方式发送给指定的人。那么,如果按照原来的逻辑,A可能就需要在原来的代码上做扩展,除了B服务,还要加上日志文件的存储和日志邮件的发送。但是,如果你使用了MQ,那么,A服务是不需要做更改的,它还是将消息放到MQ中即可,其它的服务,无论是原来的B服务还是新增的日志文件存储服务或日志邮件发送服务,都直接从MQ中获取消息并处理即可。这就是解耦,它的好处是提高系统灵活性,扩展性。
-
消峰。这个其实也很好理解,因为MQ的本质就是业务的排队。所以,面对突然到来的高并发,MQ也可以不用慌忙,先排好队,不要着急,一个一个来。消峰的好处就是避免高并发压垮系统的关键组件,如某个核心服务或数据库等。
2 使用消息队列有什么优缺点?
优点就是上面说的,在特殊场景下可以解决特定的问题,有其对应的好处:异步,解耦,削峰;
缺点:
- 系统可用性降低:系统引