rabbitMQ问题1:为什么要使用rabbitMQ?
1、任务异步处理(不重要并且耗时长的操作,需要异步处理)
2、应用程序解耦合
3、削峰填谷(对并发量而言,如数据库并发量)
rabbitMQ问题2:rabbitMQ的使用场景?
用户注册时,短信提醒;
用户下单快超时,邮件提醒;
用户确认评价功能,后续需添加赠送积分功能;
金牛的下单计算佣金
rabbitMQ问题3:rabbitMQ的实现方式?
AMQP: 一种链接协议
JMS: JavaMessage Service,应用程序接口
区别: AMQP是通过定义协议来统一数据交互的格式;JMS是一组接口,对消息操作进行统一
AMQP不限制实现方式,可跨语言;JMS只适用于java语言
AMQP的消息模式更加丰富;JMS只有两种消息模式
rabbitMQ问题4:rabbitMQ的工作模式?
1、简单模式(一生产一消费)
2、工作队列模式(一生产多消费)
3、订阅模式(发布与订阅模式,具有交换机,还有路由标识符;一生产一交换多队列多消费)
1)广播模式
2)定向模式
3)通配符模式
rabbitMQ问题5:rabbitMQ的过期时间TTL?
概念: 超出过期时间还未被消费,则会被投递到死信队列;无法再被消费
设置: 1、可针对队列设置;2、可针对消息设置;3、同时设置的话,以较小的时间为准
rabbitMQ问题6:rabbitMQ的死信队列?
死信的触发条件: 1、消息被拒绝接收;2、消息超过过期时间;3、消息超过队列设置的最大数量
死信交换机(DLX): 一个普通的交换机,只是被用来转发消息至死信队列
rabbitMQ问题7:rabbitMQ的延时队列?
实现: 通过过期时间和死信队列(死信交换机)实现
rabbitMQ问题8:rabbitMQ的消息确认机制?
1、发布确认(无论是成功确认还是失败确认,都需要各自配置)
2、事务支持(需配置,与发布确认只能二选一)
rabbitMQ问题9:rabbitMQ的消息追踪?
需要使用rabbitMQ的Trace实现;会记录每一次发送的消息,以vhost(虚拟主机)为单位
rabbitMQ问题10:rabbitMQ的集群监控?
1、管理界面监控:需开启插件rabbitmq_management
2、tracing日志监控
3、定制自己的监控系统
4、Zabbix(企业级开源解决方案)监控
rabbitMQ问题11:rabbitMQ的集群架构模式?
1、主备模型: 一主一备;主负责读写,备在主挂了时进行顶替;
2、远程模式: 实现双活,一个地域集群压力较大的时候,将数据复制到另一个地域集群处理(近端同步确认,远端异步确认)
3、镜像队列模式: 使用高可用的负载均衡,分发至其中一个镜像队列,该队列就会将消息复制到另外两个镜像队列
4、多活模式: 与远程模式类似,但远程模式实现更加复杂,推荐使用多活模式;结合镜像队列使用较好
总结: 主备模式适用于并发和数据不多的情况;远程模式已经几乎不再使用;
镜像队列模式可实现100%的消息不丢失,结合Haproxy来实现高并发业务,企业中使用最多;
rabbitMQ问题12:rabbitMQ的消息堆积?
产生原因: 1、生产者突然产生大量的消息;2、消费者消费失败;
3、消费者出现性能瓶颈;4、消费者挂掉了;
影响: 1、可能导致新消息无法进入队列;
2、可能导致旧消息无法被消费;
3、消息等待消费的时间过长,超出业务容忍范围
解决办法: 1、排查消费者的消费性能瓶颈
2、增加消费者的多线程处理
3、部署增加多个消费者
4、事后,将队列中的消息移动到另一个队列慢慢消费
rabbitMQ问题13:rabbitMQ的消息丢失?
发生的场景: 1、在生产者到MQ过程中丢失
2、在MQ中丢失(MQ宕机、重启)
3、在消费者消费过程中丢失
解决的办法: 1、使用消息确认机制(最好是异步确认,不影响主线程)
2、持久化交换机、队列、消息
3、不采用自动回复,而是在真正消费完后手动回复
rabbitMQ问题14:rabbitMQ的消息消费乱序?
概念: 针对消息消费顺序有要求的情况,是不允许出现消费乱序问题的
发生的场景: 1、工作队列模式下,多个消费者获取各自消息进行消费后,消费时长并不固定
2、简单队列模式下,为了提高消费效率,采用多线程消费;不同线程消费不同消息时长不固定
解决的办法: 1、采取多队列对应多消费者模式,生产者根据数据取余,分发给不同的队列,再给不同消费者
2、消费者获取消息后,将消息数据取余,压入不同的内存队列(list等),再给不同的线程
rabbitMQ问题15:rabbitMQ的消息重复消费?
概念: 为了防止消息在消费端丢失,消费端采用手动回复方式;那么在消费过程中,消费端与MQ的连接意外断开,MQ未收到手动回复时,就会出现重复消费
解决办法: 如果是消费业务是幂等性操作,重复消费就没问题(幂等性:执行几次都不会影响结果)
如果消费业务非幂等性操作,可在消费时保存个标识到redis中,重复消费时进行判断