消息队列使用的场景?
应用解耦: 用户下单,订单系统通知库存系统
削封填谷: 秒杀活动
日志系统 :客户端负责将日志采集,然后写入消息队列,消息队列再统一做数据的转发和存储
RabbitMq 优点
- 可靠性,RabbitMq持久化支持,保证了消息的稳定性;
- 高并发
- 集群部署简单
- 社区活跃
- 插件多
RabbitMq 角色
- 生产者: 消息的创建者,负责创建和推送数据
- 消费者:消息的接收方
- 代理者:就是RabbitMq 本身
RabbitMq 组件
RabbitMq重要的组件 :
ConnectionFactory(连接管理器) 应用程序与 RabbitMQ 之间建立连接的管理器,程序代码中使用;
Channel (信道)消息推送使用的通道;
Exchange(交换器)用于接受、分配消息;
Queue(队列) 用于存储生产者的消息;
RoutingKey(路由键) 用于把生成者的数据分配到交换器上;
BindingKey(绑定键) 用于把交换器的消息绑定到队列上
RabbitMQ 要实现消息持久化,需要满足哪些条件?
答:RabbitMQ 要实现消息持久化,必须满足以下 4 个条件:
投递消息的时候 durable 设置为 true,消息持久化,代码:channel.queueDeclare(x, true, false, false, null),参数 2 设置为 true 持久化;
设置投递模式 deliveryMode 设置为 2(持久),代码:channel.basicPublish(x, x, MessageProperties.PERSISTENTTEXTPLAIN,x),参数 3 设置为存储纯文本到磁盘;
消息已经到达持久化交换器上;
消息已经到达持久化的队列
RabbitMQ 交换器类型有哪些?
RabbitMQ 消费类型也就是交换器(Exchange)类型有以下四种:
direct:轮询方式
headers:轮询方式,允许使用 header 而非路由键匹配消息,性能差,几乎不用
fanout:广播方式,发送给所有订阅者
topic:匹配模式,允许使用正则表达式匹配消息
RabbitMQ 默认的是 direct 方式。
RabbitMQ 包含事务功能吗?如何使用?
答:RabbitMQ 包含事务功能,主要是对信道(Channel)的设置,主要方法有以下三个:
channel.txSelect() 声明启动事务模式;
channel.txComment() 提交事务;
channel.txRollback() 回滚事务。
.RabbitMQ 的事务在什么情况下是无效的?
答:RabbitMQ 的事务在 autoAck=true 也就是自动消费确认的时候,事务是无效的。因为如果是自动消费确认,RabbitMQ 会直接把消息从队列中移除,即使后面事务回滚也不能起到任何作用。