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中按顺序排序,但是会降低处理消息的速度。
消息消费一直失败出现消息积压如何处理
先保证消息不被积压,然后立刻排查代码逻辑。切换消费重试策略,将失败的消息转发给其他交换机。