这里根据个人说话口吻等编写Spring常见面试题用于记录复习后续会持续更新补充欢迎点赞收藏。消息队列常见消息队列对比RabbitMQActiveMQRocketMQKafka公司/社区RabbitApache阿里Apache开发语言ErlangJavaJavaScalaJava协议支持AMQPXMPPSMTPSTOMPOpenWire,STOMPREST,XMPP,AMQP自定义协议自定义协议可用性高一般高高单机吞吐量一般差高非常高消息延迟微秒级毫秒级毫秒级毫秒以内消息可靠性高一般高一般追求可用性Kafka、 RocketMQ 、RabbitMQ追求可靠性RabbitMQ、RocketMQ追求吞吐能力RocketMQ、Kafka追求消息低延迟RabbitMQ、Kafka说说workqueues模型指多个消费者共同处理消息大大提高工作效率了。默认为能者多劳但可以通过.yml配置prefetch修改。队列和交换机声明方式1.RabbitMQ控制台创建。2.程序编写编程式注入成Bean注解式RabbitListenerRabbitMQ有哪些核心组件1.生产者交换机队列消费者虚拟主机2.交换机分为四类Direct直连Fanout广播Topic主题Headers头3.其中fanout忽略路由键广播所有绑定的队列。Direct通过路由键与绑定键的匹配实现点对点通信。Topic通过通配符实现规则绑定惰性队列是什么为避免内存消息堆积导致存入磁盘的pageout阻塞出现了lazyqueue。LazyQueue接受消息直接存入磁盘而非内存支持懒加载可存储百万条消息。RabbitMQ的消息可靠性可以从生产者发送消息到mq可靠性mq存储消息可靠性消费者处理消息可靠性三方面入手生产者可靠性1.生产者确认机制通过.yml与全局的returncallback配置类局部的ConfirmCallback开启Publisher Confirm与Publisher Return机制。2.生产者重试机制修改.yml文件超时时间重试次数等MQ可靠性1.数据持久化交换机队列消息持久化消费者可靠性1.消费者确认机制acknackreject消息处理失败并拒绝该消息RabbitMQ从队列中删除该消息2.消费者重试机制修改.yml文件的重试次数等待时长等3.失败处理策略实现MessageRecovery接口RabbitMQ消息重复消费如何解决1.开启消费者自动确认机制但仍可能出现服务确认前宕机重启后再次消费的情况。2.通过业务唯一id检查数据库数据是否存在避免重复被消费3.可通过分布式锁避免两条消息同时被消费的情况说说RabbitMQ的延迟消息1.有两种实现方式死信交换机TTL和延迟消息插件2.当消息超时未被消费成为死信队列可绑定到死信交换机再传递给其它队列被处理实现延迟功能3.通过安装DelayExchange插件指定死信交换机与超时时间实现延迟功能数百万消息存在mq怎么解决1.使用惰性队列存储到磁盘中2.提高消费者能力使用多个消费者多线程