欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MQ学习记要

程序员文章站 2022-03-07 12:30:48
...

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: 生产上不设过期时间避免过期问题,一旦产生问题只能从源头查

 

 

 

 ——来源于石杉码农学院

 

 

 

相关标签: 分布式 MQ