RabbitMQ(消息队列,消息中间件)-创新互联

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

目前成都创新互联公司已为上1000+的企业提供了网站建设、域名、虚拟主机、网站托管、服务器租用、企业网站设计、如东网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

的实现 小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.。。)但是效率很低(没有意义,这种业务要么要效率,要么不要效率,不要效率就 一个消费队列,要效率就加个序号戳,但是又会影响效率)

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站名称:RabbitMQ(消息队列,消息中间件)-创新互联
网页URL:http://hbruida.cn/article/ddcsdj.html