面试题之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