上期写到高并发下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),无法路由的消息会发送到这个交换机上。

Map arguments = new HashMap();

// 指定交换机的备份交换机

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, Map 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篇精选干货!

rabbitmq可靠性投递_阿里Java研发二面:了解RabbitMQ?说说RabbitMQ可靠性投递相关推荐

  1. rabbitmq怎样确认是否已经消费了消息_阿里Java研发二面:了解RabbitMQ?说说RabbitMQ可靠性投递...

    上期写到高并发下RabbitMq消息中间件你应该介么玩今天给小伙伴说说!有自己看法的也可以在评论区留言探讨,也可以转发关注下我以后会长期分享! 目录: 确保消息发送到RabbitMQ服务器 确保消息被 ...

  2. mysql 左连接b表的一条数据_阿里java架构师教你怎么用mysql怒怼面试官

    转载地址: 阿里java架构教你怎么用mysql怒怼面试官​www.jianshu.com 说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了.后面我还会给出一个关于mysql面试优化 ...

  3. java 获取文件大小_阿里Java后端开发面经,面试官都替我感到绝望

    点关注,不迷路:持续更新Java相关技术及资讯!!! 内容源于群友投稿!记录一次阿里Java后端开发面经,分享给大家,感谢支持! 前言 秋招面试的第一家公司,也是第一次面试,真的超级紧张,从自我介绍到 ...

  4. 阿里java工程师要求_阿里Java P系列技术要求(P5-P7)

    阿里p系列薪资(最新数据比这个高1倍左右) 阿里P5(高级研发工程师) 工作要求: 能独立完成日常工作,并能够对一些方案提出自己的建议. 基本考核就是能上手独立完成工作,熟练掌握. 技能要求(熟练): ...

  5. 面试java回答优缺点_阿里Java开发面经分享,面试题(附回答)

    下面要给大家分享一个阿里Java开发面经,里面包含了具体的问题,以及相关回答,主要包括了数据库.操作系统.项目相关.java基础.数据结构.计算机网络等内容. 一.数据库 1.为什么在项目中用Mong ...

  6. redis 什么是冷数据_阿里Java三面凉凉:微服务,Redis,JVM一个都搞不懂

    前言: 金九银十刚刚过去了,不知道很多小伙伴都拿到自己心仪的offer没有,我这边也收到了一个粉丝投来的消息,说看到阿里的面试真题之后人都是懵的,发现自己一窍不通,下面给大家分享我这个粉丝的经历,以及 ...

  7. java 父子级json组装不用递归_2020面试阿里Java研发岗题库总结,想虐面试官不能错过的面试宝典...

    前言: 虽然天猫,蚂蚁金,菜鸟都归属阿里旗下,但每个面试官问的问题都不一样,相同点主要在流程方面.面试开始会让自我介绍,主要业务架构和技术架构两部分.业务架构一般不会深究,但要面试官听明白,并且一般面 ...

  8. 阿里java规范_阿里Java规范

    上个月在知乎上看到了关于阿里Java规范的文章,于是去网上找了一份下载,但不是最新的,文档也只是扫了一眼,没具体看.今天刚好关注的微信公众号发了一篇关于<阿里Java规范>文章,于是去下载 ...

  9. java二维数组杨辉三角_实验----Java的二维数组的应用及杨辉三角的编写

    (1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个 ...

最新文章

  1. 【Java例题】2.1复数类
  2. 位运算及在java中的应用整理
  3. SAP如何直接往系统中数据库表插入数据
  4. boost::hana::remove用法的测试程序
  5. mysql5.5 datetime默认值不能为NOW或者CURRENT_TIMESTAMP
  6. python属性错误怎么改_属性错误:无法设置属性
  7. 20-10-032-安装-KyLin-2.6.1-单机版安装(MAC官网下载)
  8. 机器学习实战(MachineLearinginAction) 第一章
  9. Fusion-IO:应用应为闪存优化
  10. java 偏向锁的撤销_源码解析-偏向锁撤销流程解读
  11. oracle数据库一个汉字占几个字节
  12. 怎么在工作中快速学习,获得晋升?——吴军得到直播实录
  13. 互联网+制造业,让你的生产管理更容易
  14. C语言已知三边求三角形的面积
  15. Jlink在ADS下的配置说明及常见问题解决办法 (转载)
  16. ISP—图像调试实习生(第七天)
  17. clamp.js用法初窥
  18. docker 雷电模拟器
  19. 架构师必须清楚的支付系统--对账系统详解
  20. 计算机控制系统直流电机闭环调速实验,4.14直流电机闭环调速实验.pdf

热门文章

  1. linux sd卡读写出错,linux系统SD卡读写问题
  2. oracle 存储过程设置回滚点,(转)oracle 存储过程事宜使用断点回滚 -savepoint
  3. 强行终止python_中国的真实离婚率:一点也不高,反而低的惊人 | 用python计算离婚率...
  4. php js 循环对象属性,js 遍历对象的属性的代码_javascript技巧
  5. 虚拟云服务器有哪些,虚拟云主机和服务器有什么区别
  6. cups支持的打印机列表_Win10“Microsoft Print to PDF”虚拟打印机不见了,如何找回?...
  7. Qt图形界面编程入门(6)
  8. JDK源码解析之 java.lang.Long
  9. Windows子系统安装图形界面
  10. 递归基础之N皇后问题