RabbitMQ(消息队列,消息中间件)

Posted admiraldeworm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ(消息队列,消息中间件)相关的知识,希望对你有一定的参考价值。

MQ:进行消息传输的中间者(服务之间可以进行消息的传递),它能让服务异步,或者说服务之间解耦

的实现 小tips:spring是解类与类之间的耦合;开发追求的就是低耦合,高内聚

一:一个小Demo: 

1:导MQ依赖

2:配置文件配置MQ的基本配置信息

3:启动类里创建队列,并且开启持久化 

4:发消息

5:收消息

二: 常见问题

1:MQ如何保证提供者消息不丢失?

假如提供方发送消息到MQ,当MQ接收后正准备存储的时候宕机了,就可能出现数据的丢失 RabbitMQ数据保护机制:
1:事务机制(已经不用了)

提供者发消息的同时会携带一个uuid,当消息持久化成功之后,Mq会给提供者返回一个消息并且携带 id(告诉你是哪个消息成功了)这过程是具有原子性的,有一个问题就是具有阻塞性(前面的消息没有 得到响应就等着),效率很低

2:confirm机制: 异步的去发送返回消息,提供者收到了就回一下,没收到就重新发送

操作实现:
1:配置文件里开启confirm机制

 2:逻辑实现:把发送给MQ的消息存储一份;如果发送成功,删除掉存储的消息;如果失败获取消息重新发送

 开启队列的持久化;配置文件开启confirm机制,设置未ture;生成uuid,保证收消息和消息的id 一致,代表同一个消息;构建一个correlationData对象就是消息对象,通过correlationData携带着 uuid(例如你发的消息是hello,它会把hello封装成correlationData对象,持久化成功后会把 correlationData对象返还回来),通过correlationData封装返回值,如果成功,删除消息,如果失败重 新发送;最后开始发送

2:MQ如何保证消费者消息不丢失?

如果消费着在消费消息的时候,服务器宕机,如何保证消息不丢失 (消费者手动ACK实现)
1:将自动签收改为手动签收

2:修改业务代码

try里面的就是核心代码,核心业务如果执行没有问题就手动签收,如果出现异常就手动拒签,MQ重新 发送;

如果核心业务执行完后,出现异常,在自动签收的情况下MQ会从新发送消息,导致重复消费;换成手 动签收后,就不会再发消息

3.如何保证消费者不重复消费?

消费者在执行完业务代码后,出现异常,会导致,MQ重新发送此消息

将自动签收改为手动签收

4.如何保证消息的幂等性?

多个相同的消息,只消费一次 (MQ无法解决,这是属于业务层面的东西,已经不是技术层面的)

幂等性的去重

5.如何防止MQ的请求洪灾 ?

(流量消峰) 消费方,请求量突然暴增,导致服务器承载不起,导致宕机

自己去拿取的数量<最大压力

6.如何保证消费的顺序性?

1:保证消费者只有一个(消息队列本来就是有存储顺序的,只有一个消费者的时候它就是按顺序消费 的)

 2:给每一个消息带一个序号(1,2,3,4,5),结合redis做序号的修改(存到redis里,通过redis判 断1执行完了执行2.。。)但是效率很低(没有意义,这种业务要么要效率,要么不要效率,不要效率就 一个消费队列,要效率就加个序号戳,但是又会影响效率)

以上是关于RabbitMQ(消息队列,消息中间件)的主要内容,如果未能解决你的问题,请参考以下文章

【rabbitMQ】消息队列之 rabbitMQ

RabbitMQ——RabbitMQ消息队列集群

消息队列 RabbitMq 的五种形式队列

RabbitMQ消息队列系列教程认识RabbitMQ

SpringBoot之RabbitMQ的使用

快速入门分布式消息队列之 RabbitMQ(上)