新手也能看懂,消息队列其实很简单

  • 时间:
  • 浏览:0
  • 来源:uu直播快3平台

  “RabbitMQ?”“Kafka?”“RocketMQ?”...在日常学习与开发过程中,亲们 儿常常听到消息队列这一关键词。我也在我的多篇文章中提到了这一概念。咋样日后是熟练使用消息队列的老手,又咋样日后是不懂消息队列的新手,不论你了不了解消息队列,本文都将带你拿出消息队列的这一基本理论。咋样日后是老手,你咋样让从本文学到你日后不曾注意的这一关于消息队列的重要概念,咋样日后是新手,相信本文将在等你打开消息队列大门的一板砖。

  我其实使用消息队列主要有两点好处:1.通过异步出理 提高系统性能(削峰、减少响应所需时间);2.降低系统耦合性。咋样让在面试的日后你被面试官问到这一大问题句子,一般情况汇报在等你在你的简历上涉及到消息队列这方面的内容,这一日后推荐你结合你当事人的项目来回答。

  JMS定义了一种生活不同的消息正文格式,以及调用的消息类型,允许你发送并接收以这一不同形式的数据,提供现有消息格式的这一级别的兼容性。



  如上图,在不使用消息队列服务器的日后,用户的请求数据直接写入数据库,在高并发的情况汇报下数据库压力剧增,使得响应数率放慢。咋样让在使用消息队列日后,用户的请求数据发送给消息队列日后立即 返回,再由消息队列的消费者线程运行运行从消息队列中获取数据,异步写入数据库。咋样让消息队列服务器出理 数率快于数据库(消息队列也比数据库有更好的伸缩性),咋样让响应数率得到大幅改善。

  亲们 儿最常见的事件驱动架构这一于生产者消费者模式,在大型网站中通常用利用消息队列实现事件驱动社会形态。如下图所示:

参考:《Java工程师面试突击第1季-中华石杉老师》

  亲们 儿都都都可以 把消息队列比作是另另2个 存放消息的容器,当亲们 儿需要使用消息的日后都都都可以 取出消息供当事人使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步出理 提高系统性能和削峰、降低系统耦合性。目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ,亲们 儿上方会一一对比有有哪些消息队列。

  除了上方说的消息消费顺序的大问题,使用消息队列,亲们 儿需要考虑咋样保证消息不被重复消费?咋样保证消息的可靠性传输(咋样出理 消息丢失的大问题)?......等等大问题。要是说使用消息队列要是是十全十美的,使用它也会让系统可用性降低、繁复度提高,另外需要亲们 儿保障一致性等大问题。



  使用队列(Queue)作为消息通信载体;满足生产者与消费者模式,二根消息越来越被另另2个 消费者使用,未被消费的消息在队列中保留直到被消费或超时。比如:亲们 儿生产者发送30条消息句子,另另2个 消费者来消费一般情况汇报下另另2个 消费者会按照消息发送的顺序各人消费一半(也就在等你另另2个 我另另2个 的消费。)

总结:

② 发布/订阅(Pub/Sub)模型

  ​ AMQP,即Advanced Message Queuing Protocol,另另2个 提供统一消息服务的应用层标准 高级消息队列协议(二进制应用层协议),是应用层协议的另另2个 开放标准,为面向消息的上方件设计,兼容 JMS。基于此协议的客户端与消息上方件可传递消息,不须受客户端/上方件同产品,不同的开发语言等条件的限制。

总结:



  发布订阅模型(Pub/Sub) 使用主题(Topic)作为消息通信载体,这一于于广播模式;发布者发布二根消息,该消息通过主题传递给所有的订阅者,在二根消息广播日后才订阅的用户则是收越来越该条消息的

本文内容思维导图:

  另外,亲们 儿知道队列 Queue 是一种生活先进先出的数据社会形态,要是消费消息时也是按照顺序来消费的。比如生产者发送消息1,2,3...对于消费者就会按照1,2,3...的顺序来消费。咋样让偶尔也会突然突然出现消息被消费的顺序不对的情况汇报,比如某个消息消费失败又咋样让另另2个 queue 多个consumer 也会原因消息被消费的顺序不对,亲们 儿一定要保证消息被消费的顺序正确。

RabbitMQ 要是基于 AMQP 协议实现的。

  消息队列使利用发布-订阅模式工作,消息发送者(生产者)发布消息,另另2个 或多个消息接受者(消费者)订阅消息。 从上图都都都可以 看后消息发送者(生产者)和消息接受者(消费者)之间越来越直接耦合,消息发送者将消息发送至分布式消息队列即刚现在开始对消息的出理 ,消息接受者从分布式消息队列获取该消息后进行后续出理 ,不须需要知道该消息从何而来。对新增业务,要是对该类消息感兴趣,即可订阅该消息,对原有系统和业务越来越任何影响,从而实现网站业务的可扩展性设计

  《大型网站技术架构》第四章和第七章均有提到消息队列对应用性能及扩展性的提升。

  咋样让用户请求数据写入消息队列日后就立即返回给用户了,咋样让请求数据在后续的业务校验、写数据库等操作中咋样让失败。咋样让使用消息队列进行异步出理 日后,需要适当修改业务流程进行配合,比如用户在提交订单日后,订单数据写入消息队列,越来越立即返回用户订单提交成功,需要在消息队列的订单消费者线程运行运行真正出理 完该订单日后,甚至出库后,再通过电子邮件或短信通知用户订单成功,以免交易纠纷。这就这一于亲们 儿平时手机订火车票和电影票。

ActiveMQ 要是基于 JMS 规范实现的。

  另外为了出理 消息队列服务器宕机造成消息丢失,会将成功发送到消息队列的消息存储在消息生产者服务器上,等消息真正被消费者服务器出理 后才删除消息。在消息队列服务器宕机后,生产者服务器会选取分布式消息队列服务器集群中的这一服务器发布消息。

①点到点(P2P)模型

  通过以上分析亲们 儿都都都可以 得出消息队列具有很好的削峰作用的功能——即通过异步出理 ,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。 举例:在电子商务这一秒杀、促销活动中,合理使用消息队列要是算是效抵御促销活动日后现在开始几滴 订单涌入对系统的冲击。如下图所示:

该文已加入开源项目:JavaGuide(一份暗含大每种Java线程运行员所需要掌握的核心知识的文档类项目,Star 数接近 16k)。地址:https://github.com/Snailclimb/JavaGuide.

  JMS(JAVA Message Service,java消息服务)是java的消息服务,JMS的客户端之间都都都可以 通过JMS服务进行异步的消息传输。JMS(JAVA Message Service,Java消息服务)API是另另2个 消息服务的标准咋样让说是规范,允许线程运行运行组件基于JavaEE平台创建、发送、接收和读撤消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。

备注: 不须认为消息队列越来越利用发布-订阅模式工作,只不过在解耦这一特定业务环境下是使用发布-订阅模式的。除了发布-订阅模式,还有点儿对点订阅模式(另另2个 消息只另另2个 消费者),亲们 儿比较常用的是发布-订阅模式。 另外,这一种生活消息模型是 JMS 提供的,AMQP 协议还提供了 5 种消息模型。

  亲们 儿知道咋样让模块之间不趋于稳定直接调用,越来越新增模块咋样让修改模块就对这一模块影响较小,另另另2个 系统的可扩展性无疑更好这一。

  消息接受者对消息进行过滤、出理 、包装后,构造成另另2个 新的消息类型,将消息继续发送出去,等待的图片 这一消息接受者订阅该消息。咋样让基于事件(消息对象)驱动的业务架构要是算是一系列流程。