MQ学习记要
1.为什么要用MQ?
系统间解耦、异步(提升响应速度)、削峰
2.引入MQ可能存在的问题:
可用性降低、复杂性增加、一致性问题
3.MQ主流产品:
ActiveMQ(https://activemq.apache.org/)
RabbitMQ(https://www.rabbitmq.com/)
RocketMQ(http://rocketmq.apache.org/)
Kafka(http://kafka.apache.org/)
对比:
4.如何保证消息队列的高可用性
RabbitMQ:
普通集群模式:
缺点1:可能会在集群内部产生大量的数据传输;
缺点2:可用性几乎没有保障,如果queue的节点宕机则导致那个queue的数据丢失。
镜像集群模式:
优点:任何一个节点宕机、其他节点还有完整数据;
缺点:不是分布式的,如果queue的数据量很大、大到机器无法容纳,怎么办?
Kafka:
分布式集群:
每台机器+每台机器上的broker进程,就可以认为是Kafka集群中的一个节点;
0.8版本以后有副本机制、leader、follower
5.如何保证消息不被重复消费(消费时的幂等性)
Kafka:offset
6.如何保证消息的可靠性(消息丢失怎么办)
RabbitMQ:
生产者丢:事务模式、confirm模式-非阻塞异步;
队列数据丢失(运行过程中宕机):开启持久化机制;
消费者丢:不用autoAck、手动ack
Kafka:
消费者丢:手动提交offsete
Kafka丢(数据仅在leader还未同步到follower):设置4个参数:
topic设置replication.factor>1
kafka服务端设置min.insync.replicas>1
生产者设置acks=all、retries=MAX
7.如何保证消息的顺序
RabbitMQ:1个queue、多个cosumer:拆分queue、queue和consumer 1v1
Kafka:1个topic、1个partition、1个consumer内部多线程:写入有序、消费者建内存队列根据写入序号存放
8.消息积压(满、延时、过期等)怎么办?
Kafka:快速取原partition到扩建partition中+扩建consumer 1v1
RabbitMQ: 生产上不设过期时间避免过期问题,一旦产生问题只能从源头查
——来源于石杉码农学院