选型

  1. MQ如何选型
    • activemq 吞吐量低 功能简单稳定,适合小项目
    • rabbitmq 5.6w/s吞吐,消息可靠性高、消息堆积不友好、erlang开发
    • rocketmq 功能强大 性能ok 社区活跃
    • kafka 海量日志处理 百万tps、功能不如rocketmq强大
  2. rocketMq和kafka的区别?
    • 性能 rocket11.6w条/秒,kafka号称百万tps,
    • rocketmq功能强大、性能稳定适合业务处理,kafka适合日志处理、数据异步备份
    • rokcetmq的可靠性更高,支持同步刷盘
    • rocketmq时延更低,支持pull长轮询; kafka批量,需要攒一批才能发
    • rocketmq和kafka都支持顺序消息,但kafka一台宕机后顺序消息会乱序
    • kafka不支持消息重试机制
    • kafka不支持定时/延时消息
    • kafka不支持事务消息
    • kafka不支持消息查询

消息存储-commitlog

rocketmq消息被消费后会立即删除吗?
不会。持久化在commitLog,48小时后才会删除不再使用的commitLog

消息消费

  1. rocketmq有几种消息模式
    • 集群消费 一条消息可以被多个消息者组消息,但只能被一个消息者组的一个consumer实例消费
    • 广播模式 所有消费者都将接收到并消息消息
  2. rocketmq支持顺序消息吗?

只能做到局部有序。生产者使用messageQueueSelecter选择一个broker,将有序消息组发到指定的broker,消息者将有序接收到消息。

  1. rocketmq消费消息时 是consumer拉模式,还是broker推消息?

有pull和push的实现。但底层都是长轮询拉的机制,不同的是,Push是consumer封装轮询过程,让业务感觉好像是推。

  1. 为什么用拉而不用推,基于事件监听?

事件驱动方式是建立长连接,由事件的方式来实时推送。
拉是按消费能力消费,避免出现在单节点堆积而不能被其他consumer节点及时消息的情况

  1. rokcetmq如何做负载均衡的?
  2. 如何保证消息可靠
    • 生产者ack确认
    • 消息者ack确实
    • 同步刷盘 宕机后消息在commitlog不丢失
  3. 消息重复消息
  • 原因:
    • 消息重试
  • 解决方案:保证消息的幂等性
    • 业务上多次调用=一次调用
    • 数据库惟一健
    • 分布式锁

消息堆积

  1. 如果上线后,发现生产和消息能力大不匹配,临时上线机器也不能解决消息能力不匹配的问题怎么办?
    • 准备一个临时topic
    • 上线1台consumer做消息的搬运工,不做业务逻辑处理,只搬运
    • 上线n台consumer同时消息临时topic中的数据
    • 改bug,测试生产能力与消息能力相当时,恢复旧的consumer继续消息之前的topic
  2. 堆积时间过长,消息超时了怎么办?

消息不会超时,在commitLog中,消息不再使用后所在commitlog才会被清理

  1. 堆积的消息会不会进入死信队列

不会,消费失败会进入重试队列 ,默认重试16次才会进入死信队列