新手学做免费网站软件好,宣传册设计与制作用什么软件,沈阳网站设计运营公司,中国建设银行用e路这么进网站上期写到高并发下RabbitMq消息中间件你应该介么玩今天给小伙伴说说#xff01;有自己看法的也可以在评论区留言探讨#xff0c;也可以转发关注下我以后会长期分享#xff01;目录#xff1a;确保消息发送到RabbitMQ服务器确保消息被正确的路由确保消息在队列正确地存储确保…上期写到高并发下RabbitMq消息中间件你应该介么玩今天给小伙伴说说有自己看法的也可以在评论区留言探讨也可以转发关注下我以后会长期分享目录确保消息发送到RabbitMQ服务器确保消息被正确的路由确保消息在队列正确地存储确保消息从队列正确地投递到消费者消费者回调补偿机制消息幂等性消息的顺序性可靠性投递首先需要明确效率和可靠性是无法兼得的如果要保证每一个环节都成功势必会对消息的收发效率造成影响如过是一些业务实时性要求不是特别高的场合可以牺牲可靠性来换取效率。①代表消息从生产者发送到Exchange②代表消息从Exchange路由到Queue③ 代表消息在Queue中存储④ 代表消费者订阅Queue并消费消息。1.确保消息发送到RabbitMQ服务器可能因为网络或者Broker的问题导致①失败而生产者是无法得知消息是否正确发送到Broker的。有两种解决方案第一种是Transaction事务模式第二种是Confirm确认模式1.在通过channel.txSelect方法开启事务之后我们便可以发布消息给RabbitMQ了如果事务提交成功则消息一定 到达了RabbitMQ中如果在事务提交执行之前由于RabbitMQ异常崩溃或者其他原因抛出异常这个时候我们便可以将其捕获进而通过执行channel.txRollback方法来实现事务回滚。使用事务机制的话会“吸干”RabbitMQ的性 能一般不建议使用。2.生产者通过调用channel.confirmSelect方法即Confirm.Select命令将信道设置为confirm模式。一旦消息被投递到所有匹配的队列之后RabbitMQ就会发送一个确认Basic.Ack给生产者包含消息的唯一ID这就使得生产者知晓消息已经正确到达了目的地了。2.确保消息被正确的路由可能因为路由关键字错误或者队列不存在或者队列名称错误导致②失败。使用mandatory参数和ReturnListener可以实现消息无法路由的时候返回给生产者。另一种方式就是使用备份交换机alternate-exchange无法路由的消息会发送到这个交换机上。MapString,Object arguments new HashMapString,Object();
// 指定交换机的备份交换机
arguments.put(alternate-exchange,ALTERNATE_EXCHANGE);
channel.exchangeDeclare(TEST_EXCHANGE,topic, false, false, false, arguments);3.确保消息在队列正确地存储可能因为系统宕机、重启、关闭等等情况导致存储在队列的消息丢失即③出现问题。解决方案1.队列持久化// String queue, boolean durable, boolean exclusive, boolean autoDelete, MapString, Object arguments
channel.queueDeclare(QUEUE_NAME, true, false, false, null);2.交换机持久化// String exchange, boolean durable
channel.exchangeDeclare(MY_EXCHANGE,true);3.消息持久化AMQP.BasicProperties properties new AMQP.BasicProperties
.Builder()
// 2代表持久化其他代表瞬态
.deliveryMode(2)
.build();
channel.basicPublish(, QUEUE_NAME, properties, msg.getBytes());4.确保消息从队列正确地投递到消费者如果消费者收到消息后未来得及处理即发生异常或者处理过程中发生异常会导致④失败。
为了保证消息从队列可靠性到达消费者RabbitMQ提供了消息确认机制message acknowledgement,消费者在订阅队列时可以指定autoAck参数当autoAck等于false时RabbitMQ会等待消费者显示地回复确认消息才从队列中删除该消息。
如果消息消费失败也可以调用Basic.Reject或者BasicNack来拒绝当前消息而不是确认如果requere参数为true可以把这条消息重新存入队列以便发送给下一个消费者。5.消费者回调消费者处理消息之后可以再发送一条消息给生产者或者调用生产者地API告知消息处理完毕。6.补偿机制对于一定时间没有响应地消息可以设置一个定时重发地机制但是要控制次数比如最多重复三次否则会造成消息堆积。7.消息幂等性服务端是没有这种控制的只能在消费端控制。如何避免消息的重复消费消息重复消费可能会有两个原因生产者的问题。环节①重复发送消息比如在开启Confirm模式但未收到确认环节④出了问题由于消费者未发送ACK或者其它原因消息重复投递对于重复发送的消息可以对每一条消息生成一个唯一的业务id通过日志或者建表来做重复控制。8.消息的顺序性消息的顺序性是指消费者消费消息的顺序跟生产者投递消息的顺序是一致的。在RabbitMQ中一个队列有多个消费者时由于不同的消费者消费消息的速度是不一样的顺序无法保证学习分享对于高并发下RabbitMq消息中间件的使用这位大咖也有讲解的视频在这免费分享给大家有需要的朋友可以帮忙点个赞关注下吧分享不易然后关注我的专栏Java快速进阶通道看顶部提示或直接点我领取哦视频教学的内容包括削峰限流、解耦作用有限资源完成高并发购票RabbitMq原理透析购票完整闭环流程单元测试与多线程高并发测试不管多忙每天给自己预留至少半小时的学习时间拒绝做代码垃圾的搬运工有不对的地方可以在评论区留言觉得不错的朋友希望能得到您的转发支持同时可以持续关注我每周定期会分享3到4篇精选干货