- 为什么使用消息队列?
解耦、异步、削峰 - 消息队列的优点和缺点?
缺点:
● 系统可用性降低-如mq挂掉,下游系统都可能会出现故障
● 系统复杂性变高
● 一致性问题 - kafka、activemq、rabbitmq、rocketmq都有什么区别以及适合哪些场景?
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
单机吞吐量 | 万级 | 万级 | 10万级 | 10万级,一般配合大数据进行实时数据计算日志采集 |
topic数量对吞吐量的影响 | topic可以达到几百、几千级别, | 几十到几百个吞吐量会大幅度下降,同等机器下尽量保证topic数量不要过多 | ||
时效性 | ms级 | 微秒级,延迟最低 | ms级 | ms以内 |
可用性 | 高,基于主从架构 | 同activemq | 分布式架构 | 分布式,一个数据多个副本 |
消息可靠性 | 有较低的概率丢失 | 经过参数优化可以做到0丢失 | 同rocketmq | |
功能支持 | mq功能完备 | 基于erlang开发,并发能力极强 | 功能完善,扩展性好 | 功能简单 |
优劣势 | 非常成熟,功能成熟,偶尔会有较低概率丢失消息,社区以及应用越来越少,官方维护也在减少 | erlang开发,性能好,延迟低,mq功能完备,社区活跃吞吐量相对比较低,erlang语言问题 | java源码,阿里,性能好,扩展方便,可以支撑大规模topic数量,社区活跃度相对较低 | 消息容易重复 |
- 高可用如何保证
rabbitmq:镜像集群模式-创建queue的数据会在所有节点上存在
kafka:(broker,topic,partition)副本机制
rocketmq:master(brokerid=0),slave集群 - 幂等性
利用数据库主键,redis设置key - 可靠性传输
rabbitmq:事务机制(基于同步机制会导致吞吐量降低),channel confirm模式,rabbitmq开启持久化功能(设置channel持久化、发送消息时设置消息持久化),消费者消费autoAck机制
kafka:消费端关闭自动提交offset改为手动提交,topic设置replication.factor值大于1,kafka服务端设置min.insync.replicas大于1,producer端设置acks=all,设置retries=Max无限次重试