面试题之RabbitMQ

你用RabbitMQ的那些功能?做了些什么?

 消息队列 

 RabbitMQ和Kafaka区别?

面试题之RabbitMQ_第1张图片

 

 面试题之RabbitMQ_第2张图片

 

 面试题之RabbitMQ_第3张图片

 RabbitMQ有哪些模式:

1)工作队列:给多个队列发送消息

2)发布/订阅

3)简单模式

 RabbitMQ重复消费如何处理?消息一致性如何解决?

1)保证接口幂等

     如何做幂等: 1、利用数据库唯一键约束 2、为更新的数据设置前置条件 3、token机制,发送的消息设置全局唯一标识,每次消费前要检查这个唯一标识是否已经存在于cache或者db里面,若不存在这放入,然后开始业务处理

2)本地记录消息发送状态,已发送的不再发送

3)已发送的消息保存到redis,判断是否已经存在

 RabbitMQ的优缺点?

优点:

1)解耦(推送机构,A,B,C 那天在来个E 再写一套,那天不需要了需要删除代码,不需要了你不监听队列就ok了),

2)异步(推送机构A发送B,C,D接收),A->B->C B->C 需要500s 那么A就需要等待500s ,只要放到队列里面,不需要同步等待处理结果

3)削峰(大量用户请求,每秒5000个请求数据库,数据库承受不了太大压力)用户-RabbitMQ-Mysql ,放到队列慢慢消费

缺点:

1)系统可用性降低(外部依赖越多,越容易挂掉) 如何实现高可用?普通集群 (消息发送待一台机器上,有其他消息去同步消息到本机器上面),镜像集群(发送消息同步到每台机器上)

2)系统复杂度提高 (如何保证重复消费,如何处理消息丢失,如何保证消息顺序行) 

3)一致性问题(A->B->C)A处理成功B,C处理失败,数据不一致 

RabbitMQ为什么会导致消息丢失?

1)produer写消息异常,消息未写入队列?如何解决?

     1 写消息失败异常重试 2 开启事务 3异步确认 有消费者告诉producer是否ACK 或者NACK (消费者回调)

2)cousumer接收到消息后,还没消费或者持久化到硬盘,RabbitMQ就挂了,消息在内存中丢失

     消费者关闭手动确认消息模式,手动发送ACK(具体处理成功后,如写mysql成功后在发送ACK)

3)RabbitMQ本身丢失消息

   做消息持久化,将消息保存到本地

 

 

 面试题之RabbitMQ_第4张图片

 

 如何保证消息顺序执行?

 

5 Producer如何保证消息不丢失?

1) trt catch 在 重试发送消息

2)开启事务模式

面试题之RabbitMQ_第5张图片

 3 )异步Confirm模式

面试题之RabbitMQ_第6张图片

 RabbitMQ本身如何保证消息不丢失?

 面试题之RabbitMQ_第7张图片 

 消费者如何保证消息不丢失?

面试题之RabbitMQ_第8张图片

 

消费者宕机如何保证消息不丢失?

面试题之RabbitMQ_第9张图片

 

你可能感兴趣的:(面试题之RabbitMQ)