专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

RabbitMQ

  1。消息队列应用场景1。1。任务异步处理
  场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1。串行的方式;2。并行方式
  a、串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端。
  b、并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间
  假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒。
  因为CPU在单位时间内处理的请求数是一定的,假设CPU1秒内吞吐量是100次。则串行方式1秒内CPU可处理的请求量是7次(1000150)。并行方式处理的请求量是10次(1000100)
  小结:如以上案例描述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。
  引入消息队列,将不是必须的业务逻辑,异步处理。
  按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。因此架构改变后,系统的吞吐量提高到每秒20QPS。比串行提高了3倍,比并行提高了两倍。1。2。应用解耦
  耦合:应用的相关性
  强耦合:应用之间具有很强的相关性
  场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图:
  传统模式的缺点:假如库存系统无法访问,则订单减库存将失败,从而导致订单失败,订单系统与库存系统耦合引入应用消息队列后的方案,如下图:
  订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功
  库存系统:订阅下单的消息,采用拉推的方式,获取下单信息,库存系统根据下单信息,进行库存操作
  假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦1。3。流量削锋
  应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。可以缓解短时间内高流量压垮应用。
  秒杀业务根据消息队列中的请求信息,再做后续处理1。4。日志处理
  日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。架构简化如下
  日志采集客户端,负责日志数据采集,定时写受写入Kafka队列
  Kafka消息队列,负责日志数据的接收,存储和转发
  日志处理应用:订阅并消费kafka队列中的日志数据2。各种消息队列产品
  (1)ActiveMQ
  ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1。1和J2EE1。4规范的JMSProvider实现。我们在本次课程中介绍ActiveMQ的使用。
  (2)RabbitMQ
  AMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得到运用。
  (3)ZeroMQ
  史上最快的消息队列系统
  (4)Kafka
  Apache下的一个子项目。特点:高吞吐,在一台普通的服务器上既可以达到10Ws的吞吐速率;完全的分布式系统。适合处理海量数据。
  JMS与AMQP区别
  说到底是协议规范与接口规范的区别
  JMS是java的接口规范,旨在为java应用提供统一的消息操作。类似于JDBC,用户都是根据相应的接口可以和实现了JMS的服务进行通信,进行相关的操作。
  JMS是API规范,具有接口开发的特点:程序结构清晰,使用方便,有利于程序设计的规范化。实现了程序的可插拔性,对于不同的需求切换不同的实现,降低了耦合度。
  AMQP是一种协议,与JMS的本质差别是AMQP不从API层进行限定,而是直接定义网络交换的数据格式。这使得实现了AMQP的provider天然性就是跨平台的,实现不同语言不同平台系统的互操作。意味着我们可以使用Java的AMQPprovider,同时使用一个python的producer加一个rubby的consumer。其类似于http协议,不同语言实现的客户端凡是遵守http协议的都可以跟web服务器做通讯。3。RabbitMQ工作原理
  各角色(如exchage、queue等)作用一定要清楚请看讲义介绍
  什么是信道?
  信道是建立在Connection之上的虚拟连接,RabbitMQ处理的每条AMQP指令都是通过信道完成的。
  我们完全可以使用Connection就能完成信道的工作,为什么还要引入信道呢?
  试想这样一个场景,一个应用程序中有很多个线程需要从RabbitMQ中消费消息,或者生产消息,那么必然需要建立很多个Connection,也就是多个TCP连接。
  然而对于操作系统而言,建立和销毁TCP连接是非常昂贵的开销,如果遇到使用高峰,性能瓶颈也随之显现。
  当每个信道的流量不是很大时,复用单一的Connection可以在产生性能瓶颈的情况下有效地节省TCP连接资源。但是信道本身的流量很大时,这时候多个信道复用一个Connection就会产生性能瓶颈,进而使整体的流量被限制了。此时就需要开辟多个Connection,将这些信道均摊到这些Connection中,至于这些相关的调优策略需要根据业务自身的实际情况进行调节。4。Rabbbitmq几种工作模式
  一个队列可以绑定多个消费者,同一个队列里的消费者不能重复消费一条消息,不同队列里的消费者是可以重复消费消息的。
  不同工作模式的最大区别在于使用不同的交换机,不同的交换机有不同的消息转发规则。
  work模式:只有默认的交换机,不能指定交换机,一个队列可以绑定多个消费者,每个队列的消息只能被其中一个消费者消费。
  订阅模式:交换机会把消息转发给所有与之绑定的queue。
  路由模式:交换机会把消息转发给所有与之绑定的且routingkey与该消息routingkey相等的queue。
  topic模式:该模式与路由模式类似,在routingkey匹配上使用通配符匹配。
  通配符:可以匹配一个标识符,可以匹配0个或多个标识符
  header模式:了解5。面试问题5。1。为什么引入消息系统?
  简答:说出应用场景5。2。如何保证RabbitMQ的高可用性?
  答:可以搭建镜像集群模式,镜像模式下queue被同步到多个节点,即使某个节点挂了,还可以通过其它节点对外提供服务。答的好,就详细讲解一下下面的内容。
  RabbitMQ有三种模式:单机模式、普通集群模式、镜像集群模式。
  单机模式
  单机模式,只能用于测试,不可用于生产环境
  普通集群模式(无高可用性)
  普通集群模式,意思就是在多台机器上启动多个RabbitMQ实例,每个机器启动一个。你创建的queue,只会放在一个RabbitMQ实例上,但是每个实例都同步queue的元数据(元数据可以认为是queue的一些配置信息,通过元数据,可以找到queue所在实例)。你消费的时候,实际上如果连接到了另外一个实例,那么那个实例会从queue所在实例上拉取数据过来。
  这种方式确实很麻烦,也不怎么好,没做到所谓的分布式,就是个普通集群。因为这导致你要么消费者每次随机连接一个实例然后拉取数据,要么固定连接那个queue所在实例消费数据,前者有数据拉取的开销,后者导致单实例性能瓶颈。
  而且如果那个放queue的实例宕机了,会导致接下来其他实例就无法从那个实例拉取,如果你开启了消息持久化,让RabbitMQ落地存储消息的话,消息不一定会丢,得等这个实例恢复了,然后才可以继续从这个queue拉取数据。
  这个方案没有什么所谓的高可用性,这方案主要是提高吞吐量的,就是说让集群中多个节点来服务某个queue的读写操作
  镜像集群模式(高可用性)https:blog。csdn。netvbirdbestarticledetails78740346
  这种模式,才是所谓的RabbitMQ的高可用模式。跟普通集群模式不一样的是,在镜像集群模式下,你创建的queue,无论元数据还是queue里的消息都会存在于多个实例上,就是说,每个RabbitMQ节点都有这个queue的一个完整镜像,包含queue的全部数据的意思。然后每次你写消息到queue的时候,都会自动把消息同步到多个实例的queue上。
  那么如何开启这个镜像集群模式呢?其实很简单,RabbitMQ有很好的管理控制台,就是在后台新增一个策略,这个策略是镜像集群模式的策略,指定的时候是可以要求数据同步到所有节点的,也可以要求同步到指定数量的节点,再次创建queue的时候,应用这个策略,就会自动将数据同步到其他的节点上去了。
  这样的话,好处在于,你任何一个机器宕机了,其它机器(节点)还包含了这个queue的完整数据,别的consumer都可以到其它节点上去消费数据。坏处在于,第一,性能开销大,消息需要同步到所有机器上,导致网络带宽压力和消耗很重!第二,,不是分布式的,就没有扩展性可言了,如果某个queue负载很重,你加机器,新增的机器也包含了这个queue的所有数据,并没有办法线性扩展你的queue。如果这个queue的数据量很大,大到这个机器上的容量无法容纳了,此时该怎么办呢?5。3。消息的可靠传输
  丢消息怎么办?在使用过程中有没有遇到消息丢失的情况?
  答:消息发送可以通过事务模式或confirm模式确认机制来确保生产者不丢消息。
  消息消费通过手动确认方式来确保消息一定会被消费。
  对queue及消息设置为持久化确保服务重启后消息不会丢失。
  搭建集群模式确保消息不会因为某个节点顺坏(如硬盘损坏)而导致消息丢失。
  哪些地方可能会丢失?
  发送消息、消费消息、存储消息。
  生产者发送消息
  从生产者弄丢数据这个角度来看,RabbitMQ提供transaction和confirm模式来确保生产者不丢消息。
  transaction模式:发送消息前,开启事物(channel。txSelect()),然后发送消息,如果发送过程中出现什么异常,事物就会回滚(channel。txRollback()),如果发送成功则提交事物(channel。txCommit())。然而缺点就是吞吐量下降了。
  原生客户端try{channel。txSelect();channel。basicPublish(exchange,routingKey,MessageProperties。PERSISTENTTEXTPLAIN,msg。getBytes());intresult10;channel。txCommit();}catch(Exceptione){e。printStackTrace();channel。txRollback();}
  comfirm模式:将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的ID。一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个ack给生产者(包含消息唯一ID)。如果RabbitMQ发生内部错误从而导致消息丢失,会发送一条nack(notacknowledged,未确认)消息。
  发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。
  在事务机制中,只有当前事务在全部镜像queue中执行之后,客户端才会收到ack的消息。同样的,在publisherconfirm机制中,向publisher进行当前message确认的前提是该message被全部镜像所接受了。
  channel的confirm模式详解
  https:blog。csdn。netxwnxwnarticledetails80462576
  消费者角度
  自动确认模式,消费者挂掉,待ack的消息回归到队列中。消费者抛出异常,消息会不断的被重发,直到处理成功。不会丢失消息,即便服务挂掉,没有处理完成的消息会重回队列,但是异常会让消息不断重试。
  手动确认模式,如果消费者来不及处理就死掉时,没有响应ack时会重复发送一条信息给其他消费者;如果监听程序处理异常了,且未对异常进行捕获,会一直重复接收消息,然后一直抛异常;如果对异常进行了捕获,但是没有在finally里ack,也会一直重复发送消息(重试机制)。
  不确认模式,acknowledgenone不使用确认机制,只要消息发送完成会立即在队列移除,无论客户端异常还是断开,只要发送完就移除,不会重发。
  启用手动确认模式可以解决这个问题
  https:www。cnblogs。comgordonkongp6952957。html?utmsourceitdadaoutmmediumreferral
  消息数据的存储
  处理消息队列丢数据的情况,一般是开启持久化磁盘的配置。这个持久化配置可以和confirm机制配合使用,你可以在消息持久化磁盘后,再给生产者发送一个Ack信号。这样,如果消息持久化磁盘之前,rabbitMQ阵亡了,那么生产者收不到Ack信号,生产者会自动重发。
  那么如何持久化呢,这里顺便说一下吧,其实也很容易,就下面两步
  设置持久化有两个步骤:
  创建queue的时候将其设置为持久化
  这样就可以保证RabbitMQ持久化queue的元数据,但是它是不会持久化queue里的数据的。
  第二个是发送消息的时候将消息的deliveryMode设置为2
  就是将消息设置为持久化的,此时RabbitMQ就会将消息持久化到磁盘上去。
  这样设置以后,rabbitMQ就算挂了,重启后也能恢复数据。在消息还没有持久化到硬盘时,可能服务已经死掉,这种情况可以通过引入mirroredqueue即镜像队列,但也不能保证消息百分百不丢失(整个集群都挂掉)
  硬盘可能损坏?
  镜像集群
  RabbitMQ主从之间的数据复制是异步的
  https:www。cnblogs。comwangzhongqiup7831854。html5。4。如何保证消息顺序消费?
  简答:确保需要顺序消费的一组消息进入同一队列,且队列只能绑定一个消费者。具体讲一个某个工作模式如何保证需要顺序消费的一组消息进入同一队列。
  顺序消费
  RabbitMQ:一个queue,多个consumer。比如,生产者向RabbitMQ里发送了三条数据,顺序依次是data1data2data3,压入的是RabbitMQ的一个队列。有三个消费者分别从MQ中消费这三条数据中的一条,结果消费者2先执行完操作,把data2存入数据库,然后是data1data3,这就导致数据没有按时消费。
  顺序消费场景
  在网购的时候,我们需要下单,那么下单需要假如有三个顺序,第一、创建订单,第二:订单付款,第三:订单完成。
  解决:
  可以使用路由模式,保证同一个订单的一组消息具有相同的routingkey,
  假如queue设置五个
  routingkeyorder0,order1,order2,order23,order24
  cal(orderid)5〔0,1,2,3,4〕5。5。如何避免消息重复的被消费
  简答:
  什么时候会重复消费?
  处理业务逻辑后,向rabbitmq发送ack消息,由于网络等原因,造成rabbitmq无法接受到ack消息,导致rabbitmq会重复发送该消息给消费者。
  解决:
  消费端处理消息的业务逻辑保持幂等性。
  方案1:
  在消息处理前进行去重判断,但每个消息需要需有一个消息的唯一ID作为去重的依据,如果消息已处理这不再进行消费,直接ack回复mq。这里我们可以使用redis存储已处理的消息id来进行去重。
  步骤
  1、查询redis是否已存在该消息id,如果存在则该消息已处理过,直接跳到第5步骤
  2、如果redis中不存在该消息的唯一id,则进行业务逻辑处理
  3、处理的业务结果保存至数据库(支持事务的数据库)
  4、将消息的id存储至redis中。
  5、发送ack至rabbitmq。
  注意:这个方案业务结果保存一定要放在支持事务的数据库中,否则在业务成功情况下,redis保存失败就会导致重复消费的问题。如果数据库支持事务,在redis操作失败的情况下可以回滚数据库保存的处理结果信息,也就无所谓再处理一次消息了。
  方案2:
  在方案1中数据库需要支持事务,假如我们使用的是mongodb,就会有重复消费的问题。
  此时我们可以把消息唯一id和处理结果一起保存到一个数据库表中,这样一起成功一起失败,也就不会有重复消费的问题了。
  前提:保证消息有一个唯一id
  步骤:
  1、如果数据库中不存在该消息的唯一id,则进行业务处理
  2、如果数据库中不存在该消息id,则进行业务处理
  3、处理的业务结果与消息唯一id保存至数据库
  4、发送ack至rabbitmq。

那些奇怪的梗那年我双手插兜那年我双手插兜源自王者荣耀主播听安,在将马超和元歌打上国服榜一之后说的一段话我说了,我只需要略微出手,就已知这个分段的极限了。你懂吗?我还是那句话,那年我双手插兜,不知道什么叫做对奢侈品鉴定引入高科技手段究竟难在哪里?日前,开云集团发布2022年第三季度业绩报告,披露第三季度收入同比增长23至51。37亿欧元,尽管受疫情影响,集团旗下品牌Gucci在亚太地区仍实现7的增长。结合国内平台发布的数据仅剩最后一个月!微软再次警告Win8。1即将停止支持今年早些时候,微软就曾告知用户,Win8。1将在2023年1月10日停止支持。今天,距离1月10日还有最后一个月的时间,微软再次警告用户,即将停止Win8。1的一切技术支持,之后微面膜再贵,敷不对也白费1市面上面膜有很多种剂型,比如片状膏状啫喱状的!总体上来说我个人不太啫喱状面膜,因为它是纯水相的凝胶,促渗透的作用可能不如面贴膜强。面贴膜贴上揭下都很方便,同时它是独立包装的,安全一字凉鞋横带太窄了怎么办,硬透明塑料凉鞋磨脚怎么处理一字凉鞋横带太窄了怎么办一字凉鞋横带太窄的话,可以使用撑鞋器来进行撑大,也可以把湿报纸塞在鞋子里面,放置一天的时间就可以了。如果一字凉鞋磨脚的话,可以在鞋子磨脚的地方涂抹一些白酒或双12哑火,最后一根稻草没了12月13日零点,2022年最后一个大促购物节双12悄然落幕。相较于今年本就静悄悄的双11,此次双12更显低调。与去年同期相比,今年,淘宝天猫抖音等平台少了铺天盖地的宣传。其中,天零售行业方案极验携手荣耀保障账号安全,为线上购物保驾护航引言2012年极验创办,至今已在20个细分行业的头部企业覆盖率达52。4,十年来极验致力于为企业提供业务安全的解决方案并引领着交互安全这一行业不断进步。现开启极验十周年人机流量治理引金融活水助绿色发展广东华兴银行以金融活水赋能绿色低碳可持续发展。文图王楚涵广东华兴银行,立足地方经济,践行金融回归本源,服务实体。创新绿色金融服务模式,丰富金融服务手段。持续为绿色低碳可持续发展注入蚂蚁投教基地养老三支柱是什么钱江晚报小时新闻记者张云山文夏珊蓉制图今年以来,事关中国14亿人的养老问题有了新的进展,被讨论多年的第三支柱终于有了眉目。随着中国老龄化加速,养老问题被关注已久,未来我们都需要为自那些从不使用花呗的女生,是因为什么?以前怕没有爱情,现在只怕没有钱。人们在狭小的圈子里互相模仿攀比阴阳怪气。不太清楚爱是什么,但没有分享欲,消息几个小时回,句句不放在心上。热生总是懂得太慢,明白太晚。最好的心理医生,观鸟有图可循饱览群鸟蹁跹位于江门市新会区的小鸟天堂。黄永照摄南方日报讯大家好,我是郎朗!祝江门小鸟天堂观鸟生态节圆满成功!12月14日,2022中国侨都(江门)第二届小鸟天堂观鸟生态节在小鸟天堂国家湿地公
艾尔登法环需要什么硬件配置艾尔登法环的硬件配置需要满足以下要求1操作系统艾尔登法环支持Windows系统,因此使用该系统的机器是最理想的,但是也支持在Linux系统中部署。2CPU艾尔登法环需要至少配置一个王鹏用佳能EOSR5EOSR6定格滑雪的精彩瞬间无忌器材丨王鹏每年冬天滑雪场开板的时候,广大滑雪爱好者都呼朋唤友齐聚滑雪场。只为在洁白的旷野中体会那种风驰电掣的感觉。当然了,也有很多摄影师喜欢在这个时候带着长枪短炮去滑雪场拍摄一搭载Windows系统的Switch?别闹,这是国产PC游戏掌机OneXPlayer2提到游戏掌机,大家可能首先会想到老任的Switch,但若是聊到PC游戏掌机呢?是不是有些触碰到你的知识空白区了?其实一些资深玩家也多少了解到近两年PC游戏掌机的发展前景,包括V社推折叠卷轴?三星概念机展示目前各家手机大厂已经先后发布过自家的折叠屏手机了,目前左右横折上下竖折这两种形式已经是比较成熟的商用方案了,接下来蓝厂和小米也会推出竖向折叠屏新机。在近日的CES2023展会上,三从二手手表到新品牌,是什么决定了手表的价值?在2022年初,一辆零售价为3。5万美元的百达翡丽5711A可能会以24万美元的价格被抢购一空。到8月,这一数字暴跌至约19万美元左右收藏家的加密货币崩溃,需要感谢或指责,取决于他安徽人游安徽新年新旅途,带上背包去邂逅新的惊喜和美景年前的周末,在置办年货的同时也别忘记放松一下心情跨省出行相对而言比较麻烦不如来西湖湿地散散心开启一个不一样的2023新年旅行西湖湿地的冬天是不能错过的处处都透露着静谧的氛围路过的一碎碎念的迎接新年吧!2022就要结束了,失去也好,顺利也罢都将化为句号,累也好,苦也罢,只要我们平安就好。这一年,遇见失去获得成长释怀完结。愿与旧事归于尽,来年依旧迎花开。人生本身就是一场减法,来日不爱喝老酒不懂怎么存?牢记这3个小技巧,别手欠,小心美酒变差酒俗话说人是旧的好,酒是陈的香。现在的白酒圈子里,不知道什么时候刮起了一阵老酒风,喝酒不再一味讲究大牌,反倒是谁尝上了一口陈年酒香,才叫人羡慕不得。可惜大部分老酒都是有价无市,甚至更不要烤箱,不要微波炉,自制香脆红薯片,一口喀吱脆关注大胖友图图,每天都能看到新奇,简单,美味又实用的食谱哦有小胖友想要我出香脆红薯片的做法。考虑到要让多有人都能做,这个食谱将不会用到烤箱和微波炉。首先去皮以后的红薯要切成薄片,越推荐5道美味佳肴,做法简单易学,超级好吃推荐5道美味佳肴,做法简单易学,超级好吃,感兴趣的朋友快来试试吧!可乐鸡翅食材鸡翅可乐姜丝葱花芝麻料酒生抽老抽盐1鸡翅洗净,正反两面划三刀以便入味鸡翅冷水下锅,升降火锅煮开后捞去浮人越简单,越能富养自己大道至简,大富亦如此。黑格尔曾说最伟大的真理最简单,同样,最简单的人也最难得。一个人,什么都不舍得扔掉,外表富得流油,人生却苦不堪言。富养自己,是追求自由生活的过程,而不是拥有金山
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网