基础
producer broker vhost exchange queen customer
- 路由:更灵活,
- 权限管理
- 高可用队列
- TTL:
exchange在和queue进行binding时会设置routingkey,这个routingkey是通配符
然后我们在将消息发送到exchange时会设置对应的routingkey,这个routingkey不是通配符
见下图:1、例如发送者:routingkey:first.green.fast,
2、对列和交换器binding:*.green.*、*.*.fast、*.*.fast
3、发送消息时,到交换器时,会匹配队列绑定的通配符,确认当前队列是否可以接受消息
4、监听消息时,只需要设置queen、eachange,无需设置routingkey(待选项,用于初始化绑定),使用springboot的注解时,很容易混淆routingkey,切记
见:https://zhuanlan.zhihu.com/p/37198933
- direct 直连模式 即:==
- topic # *:通配符 主题模式 即:like
- * 仅代表一个单词
- # 代表任意个单词
- 广播
环境:springboot
监听消息
@RabbitListener(bindings = {@QueueBinding(value = @Queue(value = OmsConstantsUtil.QUEEN_OMS_CALLBACK), exchange = @Exchange(value = OmsConstantsUtil.EXCHANGE_OMS_CALLBACK), key = OmsConstantsUtil.KEY_OMS_CALLBACK)})
发布消息:
@Autowired
private RabbitTemplate rabbitTemplate;
rabbitTemplate.convertAndSend(OmsConstantsUtil.EXCHANGE_OMS_CALLBACK, OmsConstantsUtil.KEY_OMS_CALLBACK, message);
高级应用:
- 延时队列 (削峰)
- 死信队列 : 可以实现延时队列
比如:消息超时,消息被消费者拒绝并且未设置重回队列、队列达到最大长度,超过了 Max length等
可靠性投递经验
发送端:服务端确认接收机制
事务模式:但吞吐量太低,同步阻塞模式
单条确认模式:
批量确认模式:先发送,再确认 有风险
边发送,边确认
路由保证:
路由到队列
消费者消费环节:
自动ACK
接收到信息,就发送ACK
手动ACK
问题:
channel:减少TCP连接,类似 连接池
Vhost:分区,例如:local dev
无法被路由的消息:直接丢弃
如何发给多个服务器消息
定义多个connectionfactory template listenerContainer
如何实现延迟队列
TTL + 死信队列
plugin插件
如何提高消费速度
增加消费者
动态增加消费者
container
保证消息的顺序性
一个队列只有一个消费者
大量消息堆积
MQ选型维度
1、使用 管理
2、 性能 并发 吞吐 消息堆积
3、功能
4、可用 持久化 集群
如何设计MQ
首先 存储、转发 通信协议 推或拉 等功能性需求
其次:高可用 等非功能需求