选型
- MQ如何选型
- activemq 吞吐量低 功能简单稳定,适合小项目
- rabbitmq 5.6w/s吞吐,消息可靠性高、消息堆积不友好、erlang开发
- rocketmq 功能强大 性能ok 社区活跃
- kafka 海量日志处理 百万tps、功能不如rocketmq强大
- rocketMq和kafka的区别?
- 性能 rocket11.6w条/秒,kafka号称百万tps,
- rocketmq功能强大、性能稳定适合业务处理,kafka适合日志处理、数据异步备份
- rokcetmq的可靠性更高,支持同步刷盘
- rocketmq时延更低,支持pull长轮询; kafka批量,需要攒一批才能发
- rocketmq和kafka都支持顺序消息,但kafka一台宕机后顺序消息会乱序
- kafka不支持消息重试机制
- kafka不支持定时/延时消息
- kafka不支持事务消息
- kafka不支持消息查询
消息存储-commitlog
rocketmq消息被消费后会立即删除吗?
不会。持久化在commitLog,48小时后才会删除不再使用的commitLog
消息消费
- rocketmq有几种消息模式
- 集群消费 一条消息可以被多个消息者组消息,但只能被一个消息者组的一个consumer实例消费
- 广播模式 所有消费者都将接收到并消息消息
- rocketmq支持顺序消息吗?
只能做到局部有序。生产者使用messageQueueSelecter选择一个broker,将有序消息组发到指定的broker,消息者将有序接收到消息。
- rocketmq消费消息时 是consumer拉模式,还是broker推消息?
有pull和push的实现。但底层都是长轮询拉的机制,不同的是,Push是consumer封装轮询过程,让业务感觉好像是推。
- 为什么用拉而不用推,基于事件监听?
事件驱动方式是建立长连接,由事件的方式来实时推送。
拉是按消费能力消费,避免出现在单节点堆积而不能被其他consumer节点及时消息的情况
- rokcetmq如何做负载均衡的?
- 如何保证消息可靠
- 生产者ack确认
- 消息者ack确实
- 同步刷盘 宕机后消息在commitlog不丢失
- 消息重复消息
- 原因:
- 消息重试
- 解决方案:保证消息的幂等性
- 业务上多次调用=一次调用
- 数据库惟一健
- 分布式锁
消息堆积
- 如果上线后,发现生产和消息能力大不匹配,临时上线机器也不能解决消息能力不匹配的问题怎么办?
- 准备一个临时topic
- 上线1台consumer做消息的搬运工,不做业务逻辑处理,只搬运
- 上线n台consumer同时消息临时topic中的数据
- 改bug,测试生产能力与消息能力相当时,恢复旧的consumer继续消息之前的topic
- 堆积时间过长,消息超时了怎么办?
消息不会超时,在commitLog中,消息不再使用后所在commitlog才会被清理
- 堆积的消息会不会进入死信队列
不会,消费失败会进入重试队列 ,默认重试16次才会进入死信队列