面试 MQ 中的问题

MQ

RabbitMQ kafka activeMQ rocketMQ

技术的选型?

activeMQ 现在社区都不更新了。版本更新迭代慢。 基本上不更新了。 好多公司都不用了。 支持万级的。 有比较低的几率丢失数据 技术非常的成熟。
RabbitMQ 社区比较活跃,版本更新比较频繁。是erlang 语言写的。 支持万级的。 主要是管理的页面做的非常好。吞吐量低 消息 基本上不丢。 延时低。
rocketMQ 是阿里巴巴公司的消息队列。 主要是用在分布式 支持10万级的数据 经过参数配置可以设置0丢失 吞吐量好。 性能上也好。扩展性好。毕竟是阿里产品。
kafka 要是支持大数据的日志分心和应用统计数据。 支持10万级的数据 经过参数配置可以设置0丢失。 功能上简单。主要提现在吞吐量上,可扩展性高。

引入消息队列后怎么保持高可用性?

rabbitMQ

普通集群模式

分别部署到各个机器上实现了集群。
1,各个机器上的数据进行自己同步元数据和数据
2. 几乎没有什么保障,如果queue节点的数据宕机了,数据就丢失了。
镜像集群模式
1 每个节点都有queue的镜像 就是queue 的所有数据同步 ,
2 开始镜像模式的 是在管理页面上的有个镜像模式选择all
kafka

高可用的框架
1 分别部署到各个机器上,生成broker 进程, 以topic 为单位生成 , 数据存在partition上 是分布式的。
2 只有leader 对外提供读写。 follower的备份 。 每次leader写入的数据都会同步到follower上去。 如果leader 挂了。 follower 升级为leader。

消息队列中消费收到重复的数据(幂等)?

kafka
1 每条数据都生成了offset ,消费者消费完后就提交消费消息offset数据,如果没有提交 消费者重启了。 重启后再次请求后,kafka再次请求重新
发送重复的数据了。
2 解决的办法是, 在消费者消费数据的时候在内存中设置一个内存set 把要消费的数据在set里面是否存在,存在就不走数据库。反之。

消息队列中数据丢失?

rabbitMQ
1在生产者发送rabbitmq数据丢失,2在rabbitmq加载内存中的时候加载失败了。 3消费者自己还没自己消费数据自己就挂掉了。

防止数据丢失方式:
1 走事务的模式 2使用confir模式
使用channel.confirm 提供了一个回调ack() 和nack() 方法, 把queue 设置成持久化。

取消autoAck
消费者处理数据后发送给rabbitmq ack 为true是自动处理。false 是 手动处理。

kafka数据丢失:
在producer 端设置 acks = all retries = max (尽量最大) 配置完成后就不会出现数据丢失了。

消息队列中积压几百万的数据怎么处理?

  mq中的数据出现积压的情况先快速的利用消费者把mq中的数据读出来放到别的地方(新的mq中或者是存放在一个地方),等mq中的数据消费完后。在重新写个消费者的程序来消费积压的数据。

 

原文地址:https://www.cnblogs.com/yishuo/p/14628404.html