Q1:消息队列如何保证消息可靠传输?
- 生产者不重复生产,消费者不重复消费
- 不多生产:多半问题在生产者,在消费端控制
- 保证不重复消费,消费者需要实现幂等性,确保重复消费也没问题
- 消息不丢失
- 生产者发送消息,要确认borker 确实收到并持久化了消息,比如rabbitmq的confirm机制,kafka的ack机制都能确保生产者能够把消息发给broker
- broker要等到消费者消费了这条消息才能删除这条消息,这里指的就是消费端的ack机制
Q2:消息队列有哪些作用?
- 异步
- 解耦
- 削峰
Q3:如何保证消息不被重复消费?
- mq无法解决(pull / push 都无法解决)
- 保证消费端的幂等性(多次执行和一次执行不影响处理结果)
- redis set操作 天然幂等,不过expire时间会刷新
- 生产者发送消息的时候带上一个全局唯一的id,消费者拿到消息后,先到redis里查一下是否消费过
- 基于数据库的唯一键实现
Q4:消息队列的使用场景?
- 日志收集
- 发布、订阅
Q5:死信队列和延时队列?
- 死信队列通常用来存放没有消费成功的消息,通常可以用来做消息重试 (重试失败进入死信队列)
- 延时队列通常用来存放需要在指定的时间被处理的元素的队列,通常可以用来存放具有过期性操作的业务,比如十分钟内未支付则取消订单。(延时消费)
Q6:rocketmq的架构设计?
- RocketMq是由NameServer集群、Producer集群、Consumer集群、Broker集群组成,消息生产和消费的大致原理如下:
- Broker在启动的时候向所有的nameserver注册,并保持长连接,每30s发送一次心跳
- Producer在发送消息的时候从nameserver获取Broker服务器的地址,根据负载均衡算法选择一台服务器来发送消息
- Comsumer消费消息的时候同样从nameserver获取Broker地址,然后主动拉取消息来消费
- Topic 消息类型
- message queue 相当于topic 分区,用于并行发送和接受消息
Q7:rocketmq的持久机制?
- commitLog:日志数据文件,被所有的queue共享,大小为1G,写满之后重新生成
- ConsumeQueue:逻辑queue,消息先到达commitLog,然后异步转发到consumeQueue,包含commitLog中物理位置的偏移量Offset,消息实体大小Message Tag的hash值。
- IndexFile:通过key或者时间区间查找commitLog中的消息,文件以创建的时间戳命名。固定的IndexFile大小为400M,可以保存2000w个索引。
。。。。
Q8:rocketmq的怎么实现顺序消息?
Q9:rocketmq怎么保证消息不丢失?
- 生产者:
- 同步阻塞发送消息,加上失败重试机制,可能broker存储失败,可以通过查询确认
- 异步发送消息需要重写回调方法,检查发送结果
- ack机制+可能存储CommitLog,存储ConsumerQueue失败,此时对消费者不可见
- 消费者:
- offset手动提交,消费消息保证幂等性
Q10: 消息消费的两种模式(负载均衡、广播)
- 负载均衡模式
- 消费者分担消息
- 广播模式
- 消费者都会消费消息
Q11 . 延时消息
- 发送消息后,消费者延时消费。
- 应用场景: 订单超时未支付的场景
Q12. 事务消息
- 可以用来解决分布式事务的问题
- 执行流程
- 生产者发送一个半消息(消费者此时不能进行消费)
- broker 收到消息之后 返回收到
- 生产者执行本地事务(commit or rollback)
- 本地消息提交(commit)之后,消费者可以进行消费,本地消息回滚(rollback),消费者不能进行消费
- 如果 生产者没有执行本地事务(任务超时),消费者会进行回查,检查任务状态
- mq 回查,生产者出发本地检查方法,再执行本地事务(提交 or 回滚)
- 事务消息状态
- 提交状态
- 回滚状态
- 中间状态,需要回查生产者确定
Q13. 什么是 topic、queue
- topic 是消息的分类
- 每个主体 可以包含若干条消息
- queue 是存储消息的物理实体
- 一个topic 包含多个queue
- 每个queue 存放的就是该 topic 的消息
- 一个 topic 的 queue 中的消息 只能被 一个消费者组中的一个消费者来消费
- 一个 queue 中的消息不允许同一个消费者组中的消费者消费
Q14. 生产者 和 生产者组、消费者 和 消费者组
- rocketmq 中 生产者都是以生产者组的形式出现,生产者组是同一类生产者的集合。这类 Producer 发送相同topic 的消息,一个生产者组可以同时发送多个主题的消息
- 消费者也是以消费者组的形式出现,可以通过负载均衡或这广播的形式消费消息