rabbitmq面试问题

rabbitmq如何保证消息不丢失
1.生产者弄丢了数据
开启comfirm机制
2.mq弄丢了数据
开启mq持久化机制
3.消费者弄丢了数据
ack机制

rabbitmq如何保证幂等性
得结合业务来思考
1.比如要往数据库写数据,先根据主键查一下,如果已经存在,就别插入了,upadte一下就好了
2.如果是写redis,每次都是set,天然幂等性
3.如果不是上面两个场景,那就生产者每次发送数据的时候加一个唯一id,类似订单id之类的东西,先根据这个id去比如redis里面查一下,如果已经存在说明之前消费过,就不处理了。


rabbitmq如何保证按顺序执行
针对一个queue,有多个consumer去消费的场景,有可能造成消息消费顺序错误。另外一个queue对应一个consumer,但是consumer里面进行了多线程消费,这样也会造成消息消费顺序错误。
解决方法:第一种情况可以把有关联的一组消息发送到同一个队列中,每个队列都有唯一的消费者。或者就一个queue但是对应一个consumer,然后这个consumer内部用内存队列做排队,然后分发给底层不同的worker来处理。原理和上面一样,都是保证同一组消息发给同一队列,然后被同一消费者消费。
也可以把同一组消息合并成一条,这样性能更好,能同时解决上面两种情况的问题


rabbitmq消息积压问题
1.先修复消费者问题,保证其回复消费速度,然后将现有的consumer都停掉。
2.临时建立好原先10倍或者20倍的queue数量
3.写一个分发数据的临时consumer,这个程序部署上去消费积压的数据
4.消费之后不做耗时处理,直接均匀轮询写入临时建立好的10倍的queue中
5.接着临时征用十倍的机器来部署consumer,每一批consumer消费一个临时queue的数据
6.处理好积压数据后,恢复原先架构

你可能感兴趣的:(2019年java面试,rabbitmq面试,Java高级)