Java RabbitMQ如何实现持久化和发布确认


这篇文章主要介绍JavaRabbitMQ如何实现持久化和发布确认,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!当RabbitMQ服务停掉以后消息生产者发送过的消息不丢失。默认情况下RabbitMQ退出或者崩溃时,会忽视掉队列和消息。为了保证消息不丢失需要将队列和消息都标记为持久化。1.队列持久化:在创建队列时将channel.queueDeclare();第二个参数改为true。2.消息持久化:在使用信道发送消息时channel.basicPublish();将第三个参数改为:MessageProperties.PERSISTENT_TEXT_PLAIN表示持久化消息。但是存储消息还有存在一个缓存的间隔点,没有真正的写入磁盘,持久性保证不够强,但是对于简单队列而言也绰绰有余。轮询分发的方式在消费者处理效率不同的情况下并不适用。所以真正的公平应该是遵循能者多劳的前提。在消费者处修改channel.basicQos(1);表示开启不公平分发测试目的:是否能实现能者多劳。测试方法:两个消费者睡眠不同的事件来模拟处理事件不同,如果处理时间(睡眠时间)短的能够处理多个消息就代表目的达成。先启动生产者创建队列,再分别启动两个消费者。生产者按照顺序发四条消息:睡眠时间短的线程A接收到了三条消息而睡眠时间长的线程B只接收到的第二条消息:因为线程B在处理消息时消耗的时间较长,所以就将其他消息分配给了线程A。实验成功!消息的发送和手动确认都是异步完成的,因此就存在一个未确认消息的缓冲区,开发人员希望能够限制缓冲区的大小,用来避免缓冲区里面无限制的未确认消息问题。这里的预期值就值得是上述方法channel.basicQos();里面的参数,如果在当前信道上存在等于参数的消息就不会在安排当前信道进行消费消息。测试方法:1.新建两个不同的消费者分别给定预期值5个2。2.给睡眠时间长的指定为5,时间短的指定为2。3.假如按照指定的预期值获取消息则表示测试成功,但并不是代表一定会按照5和2分配,这个类似于权重的判别。代码根据上述代码修改预期值即可。发布确认就是生产者发布消息到队列之后,队列确认进行持久化完毕再通知给生产者的过程。这样才能保证消息不会丢失。需要注意的是需要开启队列持久化才能使用确认发布。
开启方法:channel.confirmSelect();是一种同步发布的方式,即发送完一个消息之后只有确认它确认发布后,后续的消息才会继续发布,在指定的时间内没有确认就会抛出异常。缺点就是特别慢。一批一批的确认发布可以提高系统的吞吐量。但是缺点是发生故障导致发布出现问题时,需要将整个批处理保存在内存中,后面再重新发布。显然效率要比单个确认发布的高很多。在编程上比上述两个要复杂,但是性价比很高,无论是可靠性还行效率的都好很多,利用回调函数来达到消息可靠性传递的。最好的处理方式把未确认的消息放到一个基于内存的能被发布线程访问的队列。例如:ConcurrentLinkedQueue可以在确认队列confirm callbacks与发布线程之间进行消息的传递。处理方式:1.记录要发送的全部消息;2.在发布成功确认处删除;3.打印未确免费云主机域名认的消息。使用一个哈希表存储消息,它的优点:可以将需要和消息进行关联;轻松批量删除条目;支持高并发。以上是“JavaRabbitMQ如何实现持久化和发布确认”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注百云主机行业资讯频道!

相关推荐: 如何封装vue日历组件

这篇文章将为大家详细讲解有关如何封装vue日历组件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收免费云主机域名获。具体内容如下图示封装的组件的代码如下开始时间{{starttime.substring(0,4)+’-‘+star…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 01/09 09:49
下一篇 01/09 09:49

相关推荐