消息可靠性
- 保证消息不丢失(三步)
- 开启事务(不推荐)
- 开启confirm(推荐)【?confirm不理解】
- 开启rabbitMq持久化(交换机、队列、消息)【rabbit持久化是怎么支持的?】
- 关闭RabbitMq自动ack(改成手动)【自动ack改成手动,是怎么支持的?为何可以保证消息不丢失】
- 保证消息不重复消费
- 幂等性(每个消息用一个唯一标识来区分,消费前先判断标识没有被消费过,若已消费过,则直接ACK)【消息是怎么被标识的?】
- rabbitMq如何保证消息的顺序性
- 将消息放入同一个交换机,交给同一个队列,这个队列只有一个消费者,消费者只允许同时开启一个线程【这个顺序性有点奇葩,有其他方式吗?怎么才能做到】
- rabbitMq的消息重试机制
- 消费者在消费消息时,如果消费者业务逻辑出现程序异常,这是时候应该如何处理?
答案:使用消费重试机制(springboot默认3次重试机制)【用哪些类支持的】
- 如何选择合适的重试机制【具体场景有哪些,比较抽象?】
- 消费者渠道消息后,调用第三方接口,接口无法访问,需要使用重试机制
- 消费者取到消息后,抛出数据转换异常,不需要充实机制,需要发布者进行解决
- SpringBoot 消息重试机制
- 使用@EnableRetry注解:表示启动充实机制(value表示哪些异常需要触发重试,maxAccempts设置最大重试次数,delay表示重试的延迟时间,multiplier表示上一次掩饰时间是这一次的倍数)
- 代码样例 @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000, multiplier = 1.5))
- RabbitMq死信队列
消息被重新投递(publish)到另一个Exchange(死信队列),然后重新消费。说白了就是没有被消费的消息,换个地方重新消费。
死信队列是当消息再一个队列因为下列原因而变成了“死信队列”:
- 消息被拒绝(basic.reject或basic.nack)并且requeue=false【这里的几个英文单词的用处现在理解的比较空】
- 消息TTL过期【啥事TTL,怎么过期的?】
- 队列达到最大长度(队列满了,数据无法添加到mq钟)【队列有多大;队列为何会满?难道是因为没有人消费?这种情况我们生产出现过,如果规避;死信队列会满吗?】
引用
RabbitMQ如何保证消息的可靠性
posted on
2021-07-30 15:29
丶亻
阅读(
105)
评论()
收藏
举报