系统架构/消息队列

消息队列面试题

2019-10-29  本文已影响0人  lj72808up

1. 项目中为什么使用mq

(1) 解耦

(2) 异步

2. 引入消息队列后, 有什么坏处

3. 如何保证mq的高可用性

(1) Rabbit mq高可用的做法

(2) kafka高可用性的做法

4. mq consumer如何保证消息不被重复消费or如何保证消息的幂等性

(1) kafka
每条消息有一个offset, 可理解为每个消息的一个编号. consumer消费后返回offset(基于zookeeper里记录消费到了哪个offset) 或记录到kafka的一个特定队列中(__consumer_offsets下面)

如何保证消息重复消费的幂等性
(1) 为什么会出现数据的重复消费
比如kafka中, 如果consumer在消费后就宕机了, 而且还没来得及到zookeeper中记录自己消费的offset
(2) 如何保证幂等性
比如consumer消费数据时要写入databse, 可以记录一个消息主键, 重复消费时会报错但不会重复保存

5. 如何处理使用mq后消息存在丢失的问题

6. 如何保证消息的顺序性

(1) 什么时候rabbitMq的数据会出现顺序性问题
当producer只有1个, consumer有多个, 且mq以队列模式存在(每个consumer依次从mq中拿数据), 这种时候, 即使mq中的消息不乱序, 但由于consumer处理消息的速度不同, 最终产生结果的顺序会不同(比如consumer是插入数据到数据库的话)
解决办法: 需要保证顺序的消息都放到1个queue里, 同时只被1个consumer消费

(2) 什么时候kafka出现顺序问题

  1. kafka可以保证写入一个partition的数据时有序的, 所以可以在写入数据时指定一个key
producer.send(new ProducerRecord<>(topic,partition,key, msg));

比如: 设置订单id为key, 这个key相关的数据全都会发送到1个partition中

  1. kafka的另一个原则:
    1个partition只能被1个消费者消费. 即如果partition有3个, 而开启了4个consumer, 那有1个consumer会闲置
  2. 但是, 如果1个consumer内开启了多个线程处理数据, 则还会出现数据顺序的问题.
    解决办法:
    如果确实1个consumer需要多个线程并发加速处理数据, 那么可以为每个线程开启一个内存queue, 从kafka中得到数据时, 把key按照hash分发到不同的queue. 例如: 1个订单id的消息, 既可以保证生产者生产的数据在partition中有序, 也可以保证消费者在多线程下消费的顺序性

7. 有几百万消息积压在kafka消息队列怎么办

    消息积压是因为consumer出问题或下线了, 重启恢复consumer后, 首先创建1个新的topic, 让这个新的topic拥有的partition数量是原来的10倍, 修改原来的consumer代码逻辑为: 把老topic的数据消费后就存入新的topic. 然后再启动10倍的consumer消费这个新topic下的消息.
为什么不能直接启动10倍的consumer消费老topic?
    因为kafka里1个partition只能被1个consumer消费, 老topic的partition数量不变的话, 即使新增consumer, 那些consumer也会被闲置

8. 如果让你来开发一个mq中间件, 如何设计这个架构

面试官心理分析:
    其实聊到这个问题,一般面试官要考察两块:
你有没有对某一个消息队列做过较为深入的原理的了解,或者从整体了解把握住一个消息队列的架构原理。
看看你的设计能力,给你一个常见的系统,就是消息队列系统,看看你能不能从全局把握一下整体架构设计,给出一些关键点出来。
说实话,问类似问题的时候,大部分人基本都会蒙,因为平时从来没有思考过类似的问题,大多数人就是平时埋头用,从来不去思考背后的一些东西。类似的问题,比如,如果让你来设计一个 Spring 框架你会怎么做?如果让你来设计一个 Dubbo 框架你会怎么做?如果让你来设计一个 MyBatis 框架你会怎么做?
回答思路:
     首先, 让mq支持数据的分布式存储, 其次支持高可用(数据副本), 支持数据的零丢失(数据副本的一致性问题)

rabbitMQ基本概念

kafka基本概念:

topic: 队列, 相当于rabbitmq的queue
partition: 数据的分片(分布式存储数据), rabbitmq中没有分布式存储的概念

上一篇 下一篇

猜你喜欢

热点阅读