热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《RabbitMQ系列教程第一章消息中间件简介》

教程说明本系列教程目录大纲:《RabbitMQ系列教程-目录大纲》本系列教程配套代码:https:gitee.comlvshuichangliurab
教程说明
  • 本系列教程目录大纲:《RabbitMQ系列教程-目录大纲》



  • 本系列教程配套代码:https://gitee.com/lvshuichangliu/rabbitmt.git(码云地址)



第一章 消息中间件简介

1.1 概述

MQ全称为Message Queue,消息队列是消息在传递过程中的容器,消息队列常用于分布式系统之间的通信

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和最终一致性架构;使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ以下介绍消息队列在实际应用中常用的使用场景:异步处理,应用解耦,流量削锋和消息通讯四个场景

1.2 消息中间件的好处

在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高系统吞吐量

1.2.1 应用解耦

在我们的应用中,下订单同时需要调用库存系统、支付系统等业务;

在这里插入图片描述

随着业务升级,需要更改业务需求,在下订单的同时需要对接积分系统进行加积分操作,因此结果变为如下:

在这里插入图片描述

从上图的演变我们可以知道,随着业务的不断升级,业务的不多增加,我们可能需要频繁的修改订单系统的代码,现在我们的订单系统严重和其他系统耦合在一起了,可维护差;不仅如此,当订单系统调用库存系统时,如果库存系统不能够及时响应,那么必定会造成订单系统的延迟,或者库存系统出现错误,那么也很有可能导致订单系统出现故障,系统的容错性非常低;

为了解决上述问题,我们引入了消息中间件(MQ):

在这里插入图片描述

当订单系统需要对接其他系统时,只需要发消息给MQ,由MQ来通知其他系统进行业务操作,订单系统只与MQ进行对接,从而解决我们上面的几个问题;

  • 1)业务耦合

  • 2)系统延迟

  • 3)容错性低


1.2.2 异步处理

在我们没有引入MQ之前的老系统中,调用订单系统,等待订单系统处理完业务逻辑之后响应客户端大概需要时间:200ms+200ms+200ms=600ms

在这里插入图片描述

引入了MQ队列之后只需要5ms!

在这里插入图片描述

这里说明一点:我们之前讲MQ概述时已经讲过,MQ适用于一些无需即时返回且耗时的操作,假设在上述架构中,订单系统需要库存系统返回某值后才能进行下一步操作则不适用于MQ


1.2.3 流量削峰

流量削峰指的是在应用服务器面对大流量访问时,MQ可以帮助我们进行流量的限流操作,削弱流量,保证服务器的正常运行;

假设现在某电商网站搞促销活动,导致流量迅速激增,已经远远超过应用服务器的压力承受范围,此时如果不进行流量(QPS)的控制,那么应用服务器很有可能会出现故障:

在这里插入图片描述

为了防止过度的流量同时进入我们的应用服务器,导致应用服务器最终宕机,我们可以进行限流手段,即每秒从MQ中拉取1000个请求进行处理:

在这里插入图片描述

由于高并发的访问,消息会被挤压在MQ中,在高峰期过后,仍有一段时间内消息消费的速度维护在1000/s,直到挤压的消息全部被消费完毕;


1.3 消息中间件带来的问题


1.3.1 消息一致性

在这里插入图片描述

如上图,如果订单系统给其他系统发送完毕消息后,某个系统处理失败,该如何保证数据的一致性?

1.3.2 消息重复消费(消息幂等性)

当我们一个接口多次消费一个消息时,我们需要保证这个操作无论被操作多少次其结果是一样的,这个时候我们就需要保证接口的幂等性;

幂等:一个操作任意执行多次与执行一次的结果是相同的

在这里插入图片描述

在上述系统中,如果执行库存系统出现问题,那么订单系统会重发消息,但是支付和积分系统是没有任何问题的,但由于消息的重发,导致支付和积分系统再次消费一次消息;

1.3.3 成本问题


  • 系统可用性降低

系统引入的外部依赖越多,系统稳定性越差。一旦 MQ 宕机,就会对业务造成影响。如何保证MQ的高可用?

  • 系统复杂度提高

MQ 的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过 MQ 进行异步调用。需要保证MQ带来的一系列问题

1.3 常见MQ性能对比


RabbitMQActiveMQRocketMQKafka
公司/社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&Java
协议支持AMQP,XMPP,SMTP,STOMPOpenWire,STOMP,REST,XMPP,AMQP自定义自定义协议,社区封装了http协议支持
客户端支持语言官方支持Erlang,Java,Ruby等,社区产出多种API,几乎支持所有语言Java,C,C++,Python,PHP,Perl,.net等Java,C++(不成熟)官方支持Java,社区产出多种API,如PHP,Python等
单机吞吐量万级(其次)万级(最差)十万级(最好)十万级(次之)
消息延迟微秒级毫秒级毫秒级毫秒以内
功能特性并发能力强,性能极其好,延时低,社区活跃,管理界面丰富老牌产品,成熟度高,文档较多MQ功能比较完备,扩展性佳只支持主要的MQ功能,毕竟是为大数据领域准备的。

1.4 AMQP和JMS


  • AMQP:即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端中间件不同产品的限制,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。

  • JMS:JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数消息中间件提供商都对JMS提供支持。


AMQP是基于消息传输的一个应用层协议,JMS准确的来说是Java操作MQ的一套API,类似于JDBC,第三方厂商(MySQL厂商、MQ厂商)进行功能的实现,Java则使用JMS对厂商进行规范;



下一篇:RabbitMQ系列教程-第二章-RabbitMQ简介



推荐阅读
  • RocketMQ在秒杀时的应用
    目录一、RocketMQ是什么二、broker和nameserver2.1Broker2.2NameServer三、MQ在秒杀场景下的应用3.1利用MQ进行异步操作3. ... [详细]
  • 修复一个 Bug 竟耗时两天?真的有那么复杂吗?
    修复一个 Bug 竟然耗费了两天时间?这背后究竟隐藏着怎样的复杂性?本文将深入探讨这个看似简单的 Bug 为何会如此棘手,从代码层面剖析问题根源,并分享解决过程中遇到的技术挑战和心得。 ... [详细]
  • 本文提供了 RabbitMQ 3.7 的快速上手指南,详细介绍了环境搭建、生产者和消费者的配置与使用。通过官方教程的指引,读者可以轻松完成初步测试和实践,快速掌握 RabbitMQ 的核心功能和基本操作。 ... [详细]
  • SpringCloud之Bus(消息总线)
    说明:关于SpringCloud系列的文章中的代码都在码云上面地址:https:gitee.comzh_0209_javaspringcloud-ali ... [详细]
  • 本文介绍了 Java 中 io.netty.channel.kqueue.KQueueStaticallyReferencedJniMethods.evfiltSock() 方法的使用及其代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 优化后的标题:PHP分布式高并发秒杀系统设计与实现
    PHPSeckill是一个基于PHP、Lua和Redis构建的高效分布式秒杀系统。该项目利用php_apcu扩展优化性能,实现了高并发环境下的秒杀功能。系统设计充分考虑了分布式架构的可扩展性和稳定性,适用于大规模用户同时访问的场景。项目代码已开源,可在Gitee平台上获取。 ... [详细]
  • ActiveMQ是由Apache开发的一款广受欢迎且功能强大的开源消息中间件。作为完全符合JMS 1.1和J2EE 1.4规范的JMS Provider实现,尽管JMS规范已问世多年,但ActiveMQ依然保持了其在消息队列领域的领先地位。本文将带你初步了解ActiveMQ的核心概念及其应用场景,帮助你快速入门这一重要的消息传递技术。 ... [详细]
  • 顶尖编程语言,无可匹敌的选择
    我常常在想,一个人具备怎样的素质和能力,才称得上高级工程师?估计有不少人会说,“基础过硬、熟练掌握一门编程语言、至少看过一个 ... [详细]
  • 背景最近面试面得心力交瘁,由于没有高并发架构的实际项目经验,经常是在场景设计的面试题目上面栽跟头。上次就被问到了关于秒杀系统的设计,竟无 ... [详细]
  • 一文了解消息中间件RabbitMQ
    消息中间件---RabbitMQ1消息中间件的作用2.常用的消息中间件3消息中间件RabbitMQ3.1RabbitMQ介绍3.3RabbitMQ的队列模式3.3RabbitMQ的 ... [详细]
  • 启动activemq_「Java」SpringBoot amp; ActiveMQ
    一、消息队列消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构, ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 观察 | 求职体验:收到录用通知的公司通常不深究技术细节,而那些详细追问的公司往往没有后续进展
    观察 | 求职体验:收到录用通知的公司通常不深究技术细节,而那些详细追问的公司往往没有后续进展 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
author-avatar
祖朝伯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有