技术标签: java-rabbitmq java 中间件 rabbitmq
目录
2.2 RabbitMQ的高级特性(有些概念需要结合视频讲解)
MQ全称是Message Queue(消息队列),是保存消息在传输过程中的一种容器,既是存储消息的一种中间件。多是应用在分布式系统中进行通信的第三方中间件,如下图所示,发送方成为生产者,接收方称为消费者。
如上两图对比,订单系统直接远程调用支付系统、库存系统、物流系统进行通信,支付、库存、物流中的任何一个系统挂了,都会影响到订单系统的正常运行,所以订单系统的耦合度高;加了MQ之后,三个系统中的任何一个系统出现异常,订单系统还能够正常运行,即MQ实现了生产者和消费者之间的应用解耦。
如上图所示,用户点击下单后,订单系统通过MQ可以同时调用支付系统、库存系统、物流系统,完成后再将下订单的记录保存到数据库中,总共耗时是5 + 200 + 20 = 225 (ms);如果没有MQ,虽然少了访问MQ的时间,但后面的系统是逐一顺序执行的,需要的时间为200 x 3 + 20 = 620(ms),处理完用户下单的请求时间反而变慢了。
假设有一个系统,每秒只能处理1000个请求,有一个时间段,每秒有5000个请求访问A系统,如果A系统直接处理这5000个请求,系统就会崩溃。有了MQ之后,只需每秒从MQ中拉取1000个消息(请求)消费(处理)即可,没有及时处理的请求会堆积在MQ中,等访问高峰中一过,每秒可能不会有1000个请求发送过来,A系统也会从MQ中拉取1000个消息消费,直到消费完。用术语来说,MQ具有"削峰填谷"的作用。
系统引用的外部依赖越多,稳定性就越差。一旦MQ宕机,整个系统就会不可用,对业务造成影响,如何保证MQ的高可用?
引用了外部依赖,复杂度自然提高了。以前的系统通信方式是通过直接的同步远程调用,现在的系统的通信方式是通过MQ的异步调用。异步调用时就有了相应的问题,如何保证消息没有被重复消费,怎么处理消息丢失情况?怎么保证消息传递的顺序性?
既然是异步调用,有一个场景,如果A系统处理完业务之后,通过MQ给B、C系统发送消息数据,B处理成功,C处理失败,这种情况怎么处理,即如何保证消息数据处理的一致性?
名词解释:
吞吐量:每秒处理的消息条数
ActiveMQ已经淘汰了,其他三种各有千秋。
追求吞吐能力:RocketMQ、Kafka
追求消息低延迟:RabbitMQ、Kafka
追求消息可靠性:RabbitMQ、RocketMQ、
一个生产者、一个消费者,不需要设置交换机(使用默认的交换机)即可。
一个生产者、多个消费者,对同一个消息是竞争关系,不需要设置交换机(使用默认的交换机)
在订阅模型中,多了一个Exchange角色,上图中各个部分的含义
Fanout: 广播模式,将消息交给所有绑定到交换机的队列,
Direct: 路由模式,把消息交给符合指定routing key的队列
Topic: 主题模式,与路由模式的区别是用通配符匹配,把消息交给符合routing pattern的队列
注意:交换机只负责转发消息,不具备存储消息能力,所以,如果没有符合规则的队列,那么消息就会丢失!
总结:RabbitMQ工作模式总结:我的概括为RabbitMQ的工作模式有三种,分别是简单模式、工作队列模式,发布订阅模式。其中,发布订阅模式根据设置Exchange(交换机)的类型又可分为Fanout模式、Direct模式、和Topic模式。
RabbitMQ提供了两种方式用来控制消息投递的可靠性
要理解这两种模式的作用,要知道RabbitMQ消息投递的大致流程:
Producer(生产者)--->Exchange ---> Queue --->Consumer(消费者)
可以简单理解成告知Producer是否发送消息成功。
ack即Acknowledge的前三个字母缩写,确认的意思。表示消费端收到消息后的确认方式。默认是自动确认,可以改为手动确认和根据异常情况确认(一般不用)。
自动确认是指,消息一旦被Consumer接收到,就自动确认收到,将相应的message从RabbitMQ的消息缓存中移除。实际情况下,很可能消息接收到了,但业务处理出现异常,那么该消息就会消失。
手动确认是指,消费者端的业务处理成功后,调用basicAck()手动签收,然后才调用相关方法从RabbitMQ缓存中移除消息,出现业务异常时就调用basicNack()拒绝签收消息让RabbitMQ重新发送消息。
小结:RabbitMQ为了确保消息的可靠性,即保证消息不丢失,生产者是否发送成功、消费者是否消费成功都有对应的确认机制,其实为了保证消息的可靠性还要对RabbitMQ的一些消息组件进行持久化,message、queue(不看源码或者不重写RabbitMQ的一些方法验证会不能理解)等。
所以,RabbitMQ提供了三种方式保证消息丢失。
死信队列 DLX (Dead Letter Exchanges) 本身也是一个普通的消息队列,在创建队列的时候可以设置一些参数 x - dead - letter - exchange,可以将一个普通的消息队列设置为一个死信队列。
那么,什么样的消息才能被添加到死信队列中去呢?本质上没有被Consumer消费却没有丢失的消息都可以添加到死信队列中,一般是三种情况下出现死信消息(自我创造的名词)。
(1)consumer拒绝接收并且不重新放入到原目标队列的消息,设置requeue = false;
(2)原队列设置了消息过期时间,消息到达过期时间时还没被消费
(3)队列消息长度达到限制时再试图添加到队列中的消息。
幂等性概述,在MQ中,幂等性是指消费多条相同的消息时,得到与消费该消息一次相同的结果。
解决方案根据具体的业务应用场景来设计。
如在进行insert的业务操作时,可以先根据主键查一下数据库有没有该条记录,有就不insert,变为update;
在进行update的业务操作时,可以用乐观锁的机制,用版本控制更新的语句,如更新时执行的SQL语句操作是update 表名 set 字段名 = ? ,version = version + 1 where ? and version = 1。由于发送的是version = 1的请求,第一次执行后,存入数据库的version变为了2, 往后还多次发送version = 1的请求,发现找不到了version = 1 的记录,就不会执行更新操作了。
会造成消息消费顺序错乱的两种情况:
解决方式:
(1)一个queue对应一个consumer,不使用多线程。
(2)对于一个queue对应一个consumer,消费者用了多线程:消费者不直接去消费消息,而是先在consumer内部用内存队列给消息排队,将关键字相同的数据放到相同的内存队列中,每个线程只消费对应的内存队列。
文章浏览阅读1w次,点赞6次,收藏35次。题目给定一个只包括'(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例1:输入: "()"输出: true示例2:输入: "()[]{}"输出: true示例3:输入: "(]"输出: false示例4:输入: "([)]" 输出: false..._括号匹配
文章浏览阅读2.1k次,点赞2次,收藏6次。使用旧方法对自习室预订座位管理信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在自习室预订座位管理信息的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的自习室预订座位管理系统管理员,学生。管理员功能有个人中心,学生管理,座位分类管理,座位信息管理,座位预约管理,暂离信息管理,签到信息管理,退座信息管理。学生功能有个人中心,座位信息管理,座位预约管理,暂离信息管理,签到信息管理,推座信息管理。_java座位预约系统
文章浏览阅读2.1k次。【PConline DIY老司机】在1月15日的时候,英伟达终于发布了这个让广大电竞玩家盼长了脖子的功能:G-Sync Compatible,就是可以让一些非原生G-Sync的显示器用上G-Sync,这个功能对显示器行业来说可以说是具有里程碑式意义的。但想要用上这个喜闻乐见的G-Sync Compatible功能,硬件和软件方面都是有些条件要求的,想给自家显示器开G-Sync的朋友,这些预习功课要..._用n卡能不能用adaptivesync显示器技术
文章浏览阅读180次。单片机毕业设计:基于STM32的物联网电子秤。
文章浏览阅读6.8k次,点赞11次,收藏55次。霍夫变换检测直线的原理是利用累加器找到最大的(ρ,θ)(ρ,θ)(ρ,θ)数对,如文章所述。圆形的数学表达式为(x−xcenter)2+(y−ycenter)2=r2(x-x_{center})^2+(y-y_{center})^2=r^2(x−xcenter)2+(y−ycenter)2=r2,其中(xcenter,ycenter)(x_{center},y_{center})(xcenter,ycenter)为圆心坐标,rrr为圆的直径。因此可知一个圆需要xcenter,ycenter,rx_{_python霍夫变换识别同心圆
文章浏览阅读483次,点赞2次,收藏2次。多按钮点击切换不同样式_实现多个button点击后改变样式
文章浏览阅读287次。基于STM32CubeMX+STM32F103C6Tx+LCD1602+BMP180的压力温度采集Proteus仿真
文章浏览阅读1.8k次。1.背景 歌词是音乐软件必备的,没有它的存在就感觉少点什么,故实现了歌曲歌词的显示,使用LrcView实现,当然是在GitHub上找到的,是一个自定义View : LrcView 地址 : https://github.com/ChanWong21/LrcView 效果预览 : _android实现音乐歌词播放器动画
文章浏览阅读1.3k次。以cisco packet tracer 模拟器来模拟重置路由器的密码,packet tracer默认路由器端口是关闭的,需要手动启用1、把路由器关机并重启!看到###后立即按下【Ctrl+c】键中断路由器的启动过程,进入 rommon 模式!2、输入命令改变配置寄存器的值为 0x2142,这会使得路由器开机时不读取 NVRAM 中的配置文件 。然后重新启动路由器!3、路由器重启后会直接进入到 s..._思科模拟器更改enable密码不会变是怎么回事
文章浏览阅读1k次,点赞32次,收藏23次。黑吃黑?NEMTY勒索病毒RAAS服务私有化
文章浏览阅读2.3w次。参考网址:http://www.360doc.com/content/12/1015/17/4152160_241639166.shtml问题:项目能正常启动,但在系统登录时却报错!MyEclipse 报错问题。原因:由于电脑上安装了多个JDK版本,而MyEclipse IDE 使用默认版本,使得 IDE 的Compiler Compliance level 与 Installed J_nested exception is java.lang.error unresolved compilation problems
文章浏览阅读850次,点赞15次,收藏17次。博主介绍:CSDN特邀作者、985计算机专业毕业、某互联网大厂高级全栈开发程序员、码云/掘金/华为云/阿里云/InfoQ/StackOverflow/github等平台优质作者、专注于Java、小程序、前端、python等技术领域和毕业项目实战,以及程序定制化开发、全栈讲解、就业辅导、面试辅导、简历修改。精彩专栏 推荐订阅2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐。