技术标签: 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内部用内存队列给消息排队,将关键字相同的数据放到相同的内存队列中,每个线程只消费对应的内存队列。
文章浏览阅读3.3k次,点赞7次,收藏39次。CPU 执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对异常情况或特殊请求进行处理,处理完毕后再返回现行程序断点处,继续执行原程序。void 函数名(void) interrupt n using m {中断函数内容 //尽量精简 }编译器会把该函数转化为中断函数,表示中断源编号为n,中断源对应一个中断入口地址,而中断入口地址的内容为跳转指令,转入本函数。using m用于指定本函数内部使用的工作寄存器组,m取值为0~3。该修饰符可省略,由编译器自动分配。_51单片机中断篇
文章浏览阅读396次。项目经验(案例一)项目时间:2009-10 - 2009-12项目名称:中驰别克信息化管理整改完善项目描述:项目介绍一,建立中驰别克硬件档案(PC,服务器,网络设备,办公设备等)二,建立中驰别克软件档案(每台PC安装的软件,财务,HR,OA,专用系统等)三,能过建立的档案对中驰别克信息化办公环境优化(合理使用ADSL宽带资源,对域进行调整,对文件服务器进行优化,对共享打印机进行调整)四,优化完成后..._网络工程师项目经历
文章浏览阅读1k次,点赞31次,收藏30次。LVS:Linux Virtual Server,负载调度器,内核集成, 阿里的四层SLB(Server Load Balance)是基于LVS+keepalived实现。NATTUNDR优点端口转换WAN性能最好缺点性能瓶颈服务器支持隧道模式不支持跨网段真实服务器要求anyTunneling支持网络private(私网)LAN/WAN(私网/公网)LAN(私网)真实服务器数量High (100)High (100)真实服务器网关lvs内网地址。
文章浏览阅读899次。https://www.toutiao.com/a6713171323893318151/作者 | 黄小邪/言有三编辑 | 黄小邪/言有三图像预处理算法的好坏直接关系到后续图像处理的效果,如图像分割、目标识别、边缘提取等,为了获取高质量的数字图像,很多时候都需要对图像进行降噪处理,尽可能的保持原始信息完整性(即主要特征)的同时,又能够去除信号中无用的信息。并且,降噪还引出了一..._噪声很大的图片可以降噪吗
文章浏览阅读152次。目录谨慎地覆盖cloneCloneable接口并没有包含任何方法,那么它到底有什么作用呢?Object类中的clone()方法如何重写好一个clone()方法1.对于数组类型我可以采用clone()方法的递归2.如果对象是非数组,建议提供拷贝构造器(copy constructor)或者拷贝工厂(copy factory)3.如果为线程安全的类重写clone()方法4.如果为需要被继承的类重写clone()方法总结谨慎地覆盖cloneCloneable接口地目的是作为对象的一个mixin接口(详见第20_为继承设计类有两种选择,但无论选择其中的
文章浏览阅读958次,点赞21次,收藏24次。今天学长向大家分享一个毕业设计项目基于协同过滤的电影推荐系统项目运行效果:项目获取:https://gitee.com/assistant-a/project-sharing21世纪是信息化时代,随着信息技术和网络技术的发展,信息化已经渗透到人们日常生活的各个方面,人们可以随时随地浏览到海量信息,但是这些大量信息千差万别,需要费事费力的筛选、甄别自己喜欢或者感兴趣的数据。对网络电影服务来说,需要用到优秀的协同过滤推荐功能去辅助整个系统。系统基于Python技术,使用UML建模,采用Django框架组合进行设
文章浏览阅读614次。10G SFP+光模块被广泛应用于10G以太网中,在下一代移动网络、固定接入网、城域网、以及数据中心等领域非常常见。下面易天光通信(ETU-LINK)就为大家一一盘点下10G SFP+光模块都有哪些吧。一、10G SFP+双纤光模块10G SFP+双纤光模块是一种常规的光模块,有两个LC光纤接口,传输距离最远可达100公里,常用的10G SFP+双纤光模块有10G SFP+ SR、10G SFP+ LR,其中10G SFP+ SR的传输距离为300米,10G SFP+ LR的传输距离为10公里。_10g sfp+
文章浏览阅读239次。该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流项目运行环境配置:项目技术:Express框架 + Node.js+ Vue 等等组成,B/S模式 +Vscode管理+前后端分离等等。环境需要1.运行环境:最好是Nodejs最新版,我们在这个版本上开发的。其他版本理论上也可以。2.开发环境:Vscode或HbuilderX都可以。推荐HbuilderX;3.mysql环境:建议是用5.7版本均可4.硬件环境:windows 7/8/10 1G内存以上;_基于vue美食网站源码
文章浏览阅读62次。oldwain随便写@hexun链接:http://oldwain.blog.hexun.com/ ...
文章浏览阅读843次,点赞16次,收藏22次。用这个工具扫描其它网站时,要注意法律问题,同时也比较慢,所以我们以之前写的登录页面为例子扫描。_sqlmap拖库
文章浏览阅读1.5w次,点赞5次,收藏38次。Origin也能玩转图片的拼接组合排版谭编(华南师范大学学报编辑部,广州 510631)通常,我们利用Origin软件能非常快捷地绘制出一张单独的绘图。但是,我们在论文的撰写过程中,经常需要将多种科学实验图片(电镜图、示意图、曲线图等)组合在一张图片中。大多数人都是采用PPT、Adobe Illustrator、CorelDraw等软件对多种不同类型的图进行拼接的。那么,利用Origin软件能否实..._origin怎么把三个图做到一张图上
文章浏览阅读4.2k次,点赞4次,收藏51次。51单片机智能电风扇控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0042。_电风扇模拟控制系统设计