一 五种工作模式
-
最简单的传递消息
producers --》 queue --》 consumer
-
工作队列模式
producers --》 多个queue --》 consumer
-
发布/订阅模式
producers --》exchange --》 多个queue --》 consumer
-
路由
producers --》exchange --》路由键--》 多个queue --》 consumer
-
主题模式(带通配符的理由)
producers --》exchange --》(带正则符号)路由键--》 多个queue --》 consumer
号表示一个或者多个字符
*号表示一个单词
二 高级特性
1 消息可靠性投递 (针对生产者)
2. 消费者ACK
一般采用手动签收的方式,灵活处理。
3. 消费端限流
削峰填谷。 A系统无法承载请求量时,引入mq,做分批拉取。
需要在配置文件设置消息手动拉取,单个请求中消息个数的数量
#设置消费端手动 ack
spring.rabbitmq.listener.simple.acknowledge-mode=manual
#在单个请求中处理的消息个数,他应该大于等于事务数量(unack的最大数量)
spring.rabbitmq.listener.simple.prefetch=2
4. TTL
设置消息的存活时间, 比如设置订单有效时间为30分钟, 支付系统还没拿到则取消该订单。
参数名: x-message-ttl , 单位为 毫秒
注意:
通过两种方式设置过期时间。
设置队列的整体过期时间
-
设置消息的过期时间。
队列里单消息的情况: 如果消息单个设置了过期时间,队列也设置了过期时间, 则以短的为标准。
队列里多消息的情况:如果设置了队列消息为100s过期,先发5条不带自身过期时间的消息,再发一条5s过期的消息,则会在100s 之后,将六条消息一条条移除,队列只判断在顶端的消息是否过期。
1.5 死信队列
东西抛弃到垃圾桶,被别人回收。
1.6 延迟队列(对于rabbit Mq 非常特殊)
对于订单30分钟问题。
但是rabbit MQ里面没有直接提供延迟队列的功能,需要组合实现。
三 应用问题
3.1 消息可靠性问题
- 消息补偿机制 : 其实就是 Producer 再发送一条延迟消息, 去跟回调检查服务中的MogoDb中检查Consumer端是否消费了原先消息。即 延迟消息id 与MDB中是否有这个id对比,有的话,则Consumer消费成功。 若没有,则重新发,消息补偿。
3.2 消息幂等性问题
- 乐观锁 : 跟数据库乐观锁一样, 只是带一个version字段,执行完,version+1 ,若是低于这个version则是不操作的。