exchange各种模式对应的分发机制可以先在管理控制页面中配置好exchange和对应的queue。
rabbitmq消息发送可靠性
- 一般消息发送可靠性分为三个层级:最多一次,最少一次,恰好一次。
- rabbitmq只支持最多一次或者最少一次。
"最多一次"的方式,生产者随意发送,不可保证消息成功发送。
“最少一次”实现: - 消息生产者开启事务机制(比较慢)
- 确认机制。
我们这里主要说一下确认机制。
确认机制:
-
生产者的确认机制。
1.生产者在发送消息到rabbitmq之后, mq会发送确认消息给到我们的我们的生产者。
2.如果step2或者step3发送消息失败。
3.那么step4就不会执行。
4.此时定时任务会判断status是否为0,若仍为0,就记录重发次数,并重新执行step2。
5.若超过重试次数,则将status设置为2.这时候就只能等运维上班了。
生产者确认机制
消费者的确认机制:
1.rabbitmq有手动确认和自动确认。
2.自动确认:RabbitMq对消息的处理方式是默认自动应答。即无论消费者是否出现异常,都会给消息队列应答处理成功,消息队列删除消息,这时就会出现消息丢失的情况。
3.手动确认:消费者在成功处理消息之后,会给mq发送一个ack,说明自己已经处理好该消息了。
虽然rabbitmq的消息实现了可靠性,但消费者仍有可能接收到了两次的消息。例如:
1.消费者在处理完消息之后,突然挂掉了。
2.发送给mq的ack丢了。
3.消费者在处理消息时,需要很长时间。mq认为消息处理失败。就会重新发送消息到消费者。
面试题:1.怎么才能做到消息不被重复消费呢?
我们是通过redis的分布式锁实现的。将当前服务名+订单id存到redis中。下次重复消息来,就到redis中看是否已经处理过。
2.如何保证消息有序?
场景:现在有对数据库同一条数据做增删查三个操作的消息,顺序的发送到mq上。如果此时有3个消费者都可以处理这些消息。那么有可能对数据库先执行了删除的操作。
image.png
解决方案:其实只要将要求顺序的消息都发送到同一个queue,确保只有一个消费者去处理这些消息就可以了。我们可以通过配置相同的路由键,然后bind对应的queue到exchange上就可以了。
如下图,三个消费者是同一服务的不同节点,即消费者集群。我们配置多个queue,对应到不同的消费者节点,然后我们在发送的消息的时候,可以通过计算数据的id做hash计算后模3求出index,然后发送到对应index的queue上。
保证消息有序
3.消息积压问题如何解决
1.消息积压一般是处理比较慢原因引起的,之前遇到过积压是因为在高并发的代码段中,加入了数据校验的逻辑,用到了数据库io。所以一般是优化业务代码即可。
2.线上环境的消息积压:
内心OS:这tm就难搞咯。
先处理好导致处理慢的逻辑,然后做临时的水平扩容,加快处理效率。
如果消息准备就要过期了,就只能想办法将数据迁移的本地文件中。
网友评论