Q1:消息队列如何保证消息可靠传输?

  1. 生产者不重复生产,消费者不重复消费
    1. 不多生产:多半问题在生产者,在消费端控制
    2. 保证不重复消费,消费者需要实现幂等性,确保重复消费也没问题
  2. 消息不丢失
    1. 生产者发送消息,要确认borker 确实收到并持久化了消息,比如rabbitmq的confirm机制,kafka的ack机制都能确保生产者能够把消息发给broker
    2. broker要等到消费者消费了这条消息才能删除这条消息,这里指的就是消费端的ack机制

Q2:消息队列有哪些作用?

  1. 异步
  2. 解耦
  3. 削峰

Q3:如何保证消息不被重复消费?

  1. mq无法解决(pull / push 都无法解决)
  2. 保证消费端的幂等性(多次执行和一次执行不影响处理结果)
    1. redis set操作 天然幂等,不过expire时间会刷新
    2. 生产者发送消息的时候带上一个全局唯一的id,消费者拿到消息后,先到redis里查一下是否消费过
    3. 基于数据库的唯一键实现

Q4:消息队列的使用场景?

  1. 日志收集
  2. 发布、订阅

Q5:死信队列和延时队列?

  1. 死信队列通常用来存放没有消费成功的消息,通常可以用来做消息重试 (重试失败进入死信队列
  2. 延时队列通常用来存放需要在指定的时间被处理的元素的队列,通常可以用来存放具有过期性操作的业务,比如十分钟内未支付则取消订单。(延时消费

Q6:rocketmq的架构设计?

image.png

  1. RocketMq是由NameServer集群、Producer集群、Consumer集群、Broker集群组成,消息生产和消费的大致原理如下:
    1. Broker在启动的时候向所有的nameserver注册,并保持长连接,每30s发送一次心跳
    2. Producer在发送消息的时候从nameserver获取Broker服务器的地址,根据负载均衡算法选择一台服务器来发送消息
    3. Comsumer消费消息的时候同样从nameserver获取Broker地址,然后主动拉取消息来消费
    4. Topic 消息类型
    5. message queue 相当于topic 分区,用于并行发送和接受消息
    6. image.png

Q7:rocketmq的持久机制?

  1. commitLog:日志数据文件,被所有的queue共享,大小为1G,写满之后重新生成
  2. ConsumeQueue:逻辑queue,消息先到达commitLog,然后异步转发到consumeQueue,包含commitLog中物理位置的偏移量Offset,消息实体大小Message Tag的hash值。
  3. IndexFile:通过key或者时间区间查找commitLog中的消息,文件以创建的时间戳命名。固定的IndexFile大小为400M,可以保存2000w个索引。

。。。。

Q8:rocketmq的怎么实现顺序消息?

  1. 一个消息使用一个队列来消费
    1. image.png
    2. 使用 哈希算法,固定id 的消息 发布到固定到队列当中(消息队列选择器 MessageQueueSelector)

Q9:rocketmq怎么保证消息不丢失?

  1. 生产者:
    1. 同步阻塞发送消息,加上失败重试机制,可能broker存储失败,可以通过查询确认
    2. 异步发送消息需要重写回调方法,检查发送结果
    3. ack机制+可能存储CommitLog,存储ConsumerQueue失败,此时对消费者不可见
  2. 消费者:
    1. offset手动提交,消费消息保证幂等性

Q10: 消息消费的两种模式(负载均衡、广播)

  1. 负载均衡模式
    1. 消费者分担消息
    2. image.png
  2. 广播模式
    1. 消费者都会消费消息
    2. image.png

Q11 . 延时消息

  1. 发送消息后,消费者延时消费。
    1. image.png
    2. 应用场景: 订单超时未支付的场景

Q12. 事务消息

  1. image.png
  2. 可以用来解决分布式事务的问题
  3. 执行流程
    1. 生产者发送一个半消息(消费者此时不能进行消费)
    2. broker 收到消息之后 返回收到
    3. 生产者执行本地事务(commit or rollback)
    4. 本地消息提交(commit)之后,消费者可以进行消费,本地消息回滚(rollback),消费者不能进行消费
    5. 如果 生产者没有执行本地事务(任务超时),消费者会进行回查,检查任务状态
    6. mq 回查,生产者出发本地检查方法,再执行本地事务(提交 or 回滚)
  4. 事务消息状态
    1. 提交状态
    2. 回滚状态
    3. 中间状态,需要回查生产者确定

Q13. 什么是 topic、queue

  1. topic 是消息的分类
    1. 每个主体 可以包含若干条消息
    2. image.png
  2. queue 是存储消息的物理实体
    1. 一个topic 包含多个queue
    2. 每个queue 存放的就是该 topic 的消息
    3. 一个 topic 的 queue 中的消息 只能被 一个消费者组中的一个消费者来消费
    4. 一个 queue 中的消息不允许同一个消费者组中的消费者消费
    5. image.png

Q14. 生产者 和 生产者组、消费者 和 消费者组

  1. rocketmq 中 生产者都是以生产者组的形式出现,生产者组是同一类生产者的集合。这类 Producer 发送相同topic 的消息,一个生产者组可以同时发送多个主题的消息
  2. 消费者也是以消费者组的形式出现,可以通过负载均衡或这广播的形式消费消息

Q15 下单的整个流程

image.png