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(消息队列,消息中间件)-创新互联
文章位置:http://lswzjz.com/article/ddcsdj.html