RabbitMQ基本架构、保证消息可靠性

RabbitMQ交换器类型

Fanout(广播)将消息分发给每一个绑定该交换机的队列。
direct(定向)

将消息发给绑定该交换机的指定队列。 交换机发送消息时应当指定rountingKey,在消息队列中接收消息时指定bindingKey,当rountingKey与bindingKey相等时消息才会从交换机发给指定队列。

Topic(主题)将消息发给绑定该交换机的指定队列,topic主题中消息Key可由多个单词拼接组成主题。区别在于Topic不要求rountingKey=bindingKey,而是rountingKey的前后缀=bindingKey的前后缀+通配符。(举个例子rountingKey=china.weather,bindingKey=china.#。那么该消息队列就可以订阅china主题的消息)

消息可靠性如何保证

MQ中涉及三个角色:消息生产者、MQ、消息消费者。三者都需要保证消息可靠性

消息生产者保证消息可靠性

ack的对象是生产者与queque队列

        通过ack确认机制,当消息发送到队列时返回给生产者ack表示消息已经被消费了(临时消息队列在消息发送到队列时立刻就会返回ack,持久化队列在消息保存到磁盘之后才能够返回ack)。如果生产者收到的消息是NACK表示消息发送失败,需要生产者重新发送消息。

消息重发:生产者通过MQ对象的ReturnCallBack回调函数接收ack确认码(可以通过同步或者异步的方式接收)。如果ack码为NACK,在while循环中重新发送消息

MQ保证消息可靠性

        MQ默认消息存储在内存当中,如果MQ宕机就会导致消息丢失,通过持久化将消息保存到磁盘中确保消息可靠。        

        1.持久化,交换机持久化(设置持久化类型为Durable)、队列持久化(设置持久化类型为Durable)、消息持久化(消息投递模式选2,消息持久化)。

        2.惰性队列(Rabbit3.6之后),消息不直接存到内存中,而是先写到磁盘中需要时再加载到内存中去。

消费者保证消息可靠性

ack对象是消费者与queue队列

        通过ack机制确保消费者和queue消息可靠。配置acknowledge-mode=auto启动MQ自带ack机制,其中返回ack表示业务正常NACK表示业务代码出错rejuct表示消息中参数出现错误

消息一直失败如何处理

通过参数配置,先本地循环重试,如果重试次数耗尽交给MQ处理

        MQ三种重试策略:

                1.重试耗尽直接reject,拒绝消息。

                2.重试耗尽返回给生产者NACK,重新入队。

                3.重试耗尽将消息转发给其他交换机(做一个失败预警的功能)

MQ如何确保消息幂等性

任何幂等问题都可以通过唯一id去解决消息消费前先判断消息唯一id是否存在,如果不存在说明未消息,存在消息消费过。(例如下单操作,如果下过单判断订单状态就可以确定是否下单,唯一id的作用相同)

MQ如何保证消息发送的顺序

为什么要保证消息发送的顺序:如果不保证,可能出现本来对数据插入-更新-删除变为删除-插入-更新,业务意思发生改变

一个queue对应一个消费者,消息就会按照顺序在queue中按顺序排序,但是会降低处理消息的速度。

消息消费一直失败出现消息积压如何处理

先保证消息不被积压,然后立刻排查代码逻辑。切换消费重试策略,将失败的消息转发给其他交换机。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值