面试题之RabbitMQ

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

 消息队列 

 RabbitMQ和Kafaka区别?

 

 

 

 

 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本身丢失消息

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

 

 

 

 

 如何保证消息顺序执行?

多个消费者,每个消费者有单独的quue

 

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

1) trt catch 在 重试发送消息

2)开启事务模式

 3 )异步Confirm模式

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

  

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

 

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

Kafka如何保证消息顺序执行?

同一个partition的消息本身就是有顺序的,一个 topic,一个 partition,一个 consumer,内部单线程消费

消费者内部多线程如何实现顺序执行?

内存新建一个队列,存放从kafka消费到的数据,然后用多线程从队列里面获取执行

Kafka如何实现广播机制?

多个消费者设置同一consumer group

 

posted @ 2020-01-16 16:54  暖暖-木木  阅读(270)  评论(0编辑  收藏  举报