使用rabbitmq的场景流程
product -> rabbitmq broker ->exchange ->queue ->consumer ->业务处理
根据上面的流程:
1、如果 在product ->exchange 发送 成功或者异常,此时可以根据下面的设置,捕捉到消息。
2、如果在exchange -> queue 发送异常的时候(注意只是异常的时候才能捕捉到),并且分别在配置文件和代码中打开配置,否则消息会直接被丢弃。
3、如果queue ->consumer ->业务处理 出现问题,
这里涉及到 消费者从队列当中签收的问题。
默认是自动签收,如果自动签收,那么当业务处理出现问题时,那这个消息就无法重新回到mq当中。
如果将签收设置为手动签收,那么当业务处理没有问题,可以手动签收,如果出现异常就可以将消息重回队列当中,设置手动签收的方式是,将监听器的ack类型设置为 manual。
消费限流
这里 就是在消费者这段加入属性,限制消费端一次性拉取多少信息,来保证消费限流。
rabbitmq的高级特性
1、TTL 全称 time to live (存活时间)
(1)如果设置了消息的过期时间,也设置了队列的过期时间,它以时间短的为准。
(2)队列过期后,会将队列所有消息全部移除。
(3)消息过期后,只有消息在队列顶端,才会判断其是否过期(生产者将消息给到rabbitmq的顺序是按照队列的先进先出的规则)。
2、死信队列
私信队列的定义:
消息进入第一道交换机之后,因为过期时间到了、或者超过队列长度、或者消费端拒绝ack,导致该消息进入到与该队列绑定的第二道交换机,与第二道交换机绑定的队列,叫做死信队列。
这里设置的方式(这里设置的是第一个道交换机的正常队列):
1、要设置两个交换机并且分别绑定一个队列。
2、把正常的队列按照如下的方式进行绑定。
这样设置之后,可以在队列的一个限制下,(1)超过队列消息的长度(2)超过消息的最大生存时间(3)消费者拒收(
不让消息重回队列。
)
3、延迟队列
延迟队列的使用场景:
消费者在下单之后,先进入到一个正常的交互机x队列当中,然后经过30分钟的等待(因为一般用户下单30分钟之内付账该订单才是有效的),才会把消息给到另一个交换机当中,并路由到其队列中。此时消费者可以根据队列的订单信息去库中查,该订单是否生效,生效就扣库存,否则不扣库存。
延迟队列的形成条件:
1、延迟队列定义:消息进入队列中,可以延迟一段时间再进行消费
2、rabbitmq 没有提供延迟队列,可以使用 TTL+死信队列 来构成
4、日志追踪
打开这个日志功能,会在可视化的界面多一个叫做 tracing选项,进行设置之后,就会有一个空的。.log文件,记录了所有的发送和消费的信息。
5、消息补偿
6、幂等性(乐观锁机制)
乐观锁的机制就是使用 cas +版本号控制
幂等性定义:因为信息补偿或者其他原因导致的,生产者向rabbitmq发送了多个消息,此时应该保证,消费者无论消费多少条队列当中的消息,都要保证结果跟消费第一条的结果相同。
这里就是增加了一个版本号在里面,第一次执行的时候,会找到对应的一个版本,修改完之后 就变成另一个版本,此时再去消费相同的信息的时候,那么版本号给到还是旧的,因为版本号已经变更,此时就无法修改旧的版本号,从而保证了幂等性。