RabbitMQ初步到精通-第一章-消息中间件介绍

news2024/12/23 5:59:05

第一章 消息中间件介绍

1.MQ概述

MQ全称是Message Queue,消息的队列,因为是队列,所以遵循FIFO 先进先出的原则,它是一种跨进程的通信机制,用于上下游传递消息。

在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削峰等问题实现高性能,高可用,可伸缩和最终一致性架构;

使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。

例如下图所示:

原Client1是与Client2直接交互的,

升级后的架构中间加入MQ后,Client1将消息直接发送到MQ,MQ接收成功后便直接返回给Client1成功状态,Client1可以再去处理其他消息。

这时候MQ就成为了一个中转站,MQ接收到消息后可以通过推的方式,推送给订阅自己的Client2,也可以通过Client2主动拉取的方式,获取到Msg消息,进行处理。

处理完成后给MQ一个ACK通知,此消息就会从MQ中删除掉。

2.为什么使用MQ

既然有这样的中间件产品,那必然会有他的用武之地。一般大家会从异步处理,应用解耦,流量削峰这些维度去分别举例介绍。本文举一个例子来涵盖这些内容。

2.1 举个栗子:

如上图,这是一个实际的支付系统中的一个场景,用户通过支付服务扣款100,首先会调用一次账户服务扣除 用户余额100,(此步骤交互图中已省略),扣款成功后,立马会返回给用户支付成功的状态,但程序还会去处理扣款后的剩余事项,例如给商户上账、调用风控事后监控、发消息给用户、调用结算服务记录清分流水等等。

如果我们使用上图中的系统交互,首先调用账户、再调风控、调结算、调消息。。。最后返回给用户支付成功。

会存在什么问题?

  1. 系统严重耦合 - 这几个系统中存在关联关系,且执行也有先后顺序,任何一个系统的变化都有可能导致整条链路出现问题,如果再新加一个库存服务呢,又会对整体产生影响。
  2. 调用时间太长 - 用户支付动作,在用户侧关注的是什么?是有没有支付成功,即用户的钱被扣了就可以告诉用户支付成功,至于后面的一系列动作,跟用户不再产生关系,用户也不必关注。等全部执行完,再告诉用户执行时长可想而知。。
  3. 并发能力太弱 - 在业务系统开展活动时,需要一个高并发的系统支撑,我们无法迅速去提升,因为整体的并发能力完全依赖与所有的服务,而有的服务可能并发性就不是很好,或提升很慢,例如账户服务[核心诉求是记对账],这样整体的并发无法保证。

2.2 优化栗子

 经过优化,我们中间引入MQ中间件,实现了异步化,支付服务不再和后面的任何服务进行耦合关联,只关注于消息的投递。消息投递成功后,即返回给前端用户支付成功。

带来的变化:

1. 系统解耦 -系统间不耦合,任何系统的变化不对整体链路产生影响

2. 异步提速 - 支付动作整体的耗时花费在了 用户与支付服务交互,后面的执行时间不再累计到整体链路中

3. 流量削峰 - 针对用户高并发的场景只要优化支付服务即可,而后续的服务无法承载如此高的并发,这时候MQ便起到一个中转暂存的作用,产生了一个削峰的作用。既提高了用户的并发能力,又保护了后端相应的低并发服务。

 当然,还有一些其他的场景中都是会存在MQ的身影,不再一一列举了,但凡在使用过程中我们遇到一些想使用异步的场景,都可以考虑是否可以引入MQ。

3.MQ使用缺点

凡事有利就有弊~,事物都有两面性。再看下引入MQ后的系统缺点:

  • 系统可用性降低 -系统引入的外部依赖越多,越容易挂掉。本来 A 系统调用 BCD 三个系统的接口就好了,ABCD 四个系统好好的,没啥问题。硬加个 MQ,MQ 挂了,整套系统就崩溃了,风险很大。因此,系统可用性降低。
  • 系统复杂性增加 -要多考虑很多方面的问题,如何处理消息丢失的情况?如何保证消息传递的顺序性?如何保证消息没有重复消费?
  • 数据一致性问题- A 系统处理完了直接返回成功了,人都以为这个请求就成功了;但要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,这数据就不一致了。所以消息队列实际是一种非常复杂的架构,引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉,系统复杂度提升了一个数量级,也许是复杂了 10 倍。

但这些缺点也可以通过一些手段去克服,总归引入MQ还是利大于弊的,要设计好整体的方案。

4.常见MQ对比

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/14816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读笔记 | 三维目标检测——VeloFCN算法

如有错误,恳请指出。 文章目录paper:《Vehicle Detection from 3D Lidar Using Fully Convolutional Network》 对于64线激光雷达全范围扫描出来的点云进行特征图的构建。对于具体的点(xyz坐标),其在水平方向上可以通…

一个是证书服务和web安全访问配置,一个是PGP的使用

一个是证书服务和web安全访问配置,一个是PGP的使用 IIS介绍 IIS是本机自带的服务,用于上线web网页;虽然是自带但因为非开发人员用不到,所以属于预安装;在本机搜索下载即可, 打开后 证书服务,认…

LeetCode[105]从前序与中序遍历序列构造二叉树

难度:中等 题目: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,1…

Vue基础4

Vue基础4计算属性姓名案例 - 第一种用click.keyup的方法姓名案例 - 第二种用v-model双向绑定的方法姓名案例 - 第三种使用methods方法姓名案例 - 第四种使用计算属性的方法计算属性的简写—只考虑读取,不考虑修改时候使用监视属性第一种普通写法第二种用计算属性的写…

【信号处理】卡尔曼(Kalman)滤波(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

Java内部类分类

文章目录内部类分类局部内部类的使用匿名内部类成员内部类静态内部类一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。是我们类的第五大成员 思考:类的五大成员是哪些? - 属性、方法、构造器、代码块、内…

Windows安装Git教程(2022.11.18 Git2.38.1)

(1)首先前往Git官网,下载安装文件: (2)打开安装程序,把Only show new options的勾去掉,点击Next: (3)此处可以选用默认设置,也可以勾…

ProCAST一键导出有限元模型的几何拓扑和属性信息

第一次将ProCast有限元后处理中的数据导出,当时没有经验,方法比较粗暴,详情见文章:ProCast导出节点应力数据并格式化。 最近发现了一种更高效的数据导出“新姿势”,能够快速得到有限元模型的几何拓扑和节点属性数据&a…

电科大离散数学-2-命题逻辑-2

目录 2.7 范式 2.7.1 范式的定义 2.7.2 范式存在定理 2.8 主析取范式和主合取范式 2.8.1 极小项和极大项的定义和编码 2.8.2 极小项和极大项的性质 2.8.3 主析取范式和主合取范式的定义 2.8.4 主范式求解定理 2.8.5 真值表技术 2.8.6 范式的相互转化 2.8.7 主范式的…

[附源码]Python计算机毕业设计jspm计算机学院党员积分管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Markdown 教程之如何在 Markdown 文档中添加流程图、方程式和交互式图形

您是否遇到过想要在 Markdown 文档中包含一些简单图表或方程式的场景?如果这是一次性的事情,你可以做的是使用 Power Point 或在线生成器,将图表保存为图像并将其放在你的文章中。这种方法的缺点是背景颜色可能与您的文章不匹配,并且进行更改非常耗时。 Markdown 扩展是第…

[附源码]java毕业设计柠檬电动车租赁系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

java selenium (五) 元素定位大全

页面元素定位是自动化中最重要的事情, selenium Webdriver 提供了很多种元素定位的方法。 测试人员应该熟练掌握各种定位方法。 使用最简单,最稳定的定位方法。 自动化测试步骤 在自动化测试过程中, 测试程序通常的操作页面元素步骤 1. 找到…

【快速上手系列】内网穿透(natapp)的快速上手和简单使用教程

【快速上手系列】内网穿透(natapp)的快速上手和简单使用教程 使用 1、natapp配置 网址 https://natapp.cn/ 官方文档 https://natapp.cn/article/natapp_newbie (这个也挺言简意赅的😎) 点击下载或向下划到客户端…

读写算杂志社读写算编辑部读写算杂志2022年第30期目录

课程改革 新课程理念下学生自主学习能力培养策略探究 陈璟; 1-3 新课改下初中语文教学中名著阅读教学策略探究 赵璇; 4-6 教育创新《读写算》投稿:cn7kantougao163.com 多媒体辅助下初中物理教学方法改革策略分析 张鹤贵; 7-9 关于互联网环境下小学美术课堂教学模式…

LVGL | 1.LVGL PC模拟器之CodeBlocks

LVGL的学习与使用 LVGL | 1.LVGL PC模拟器之CodeBlocks 1.资源 1-1.主页:https://lvgl.io/ 1-2.LVGL | LVGL简介之中文文档 1-3.LVGL | LVGL快速概述之中文文档 1-4.问题反馈:https://forum.lvgl.io/ 1-5.LVGL开源GUI零基础入门课程(韦东山监制) 教程基…

【附源码】计算机毕业设计JAVA沙县小吃点餐系统

项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven Vue 等等组成,B/…

通信电源专业技术交流

UPS电源 •UPS为交流不间断供电电源系统的英文缩写。• UPS系统原理:UPS系统由整流模块、逆变器、蓄电池、静态开关等组成。整流模块(AC/DC)和逆变器(DC/AC)都为能量变换装置,蓄电池为储能装置。除此还有间…

docker部署Jenkins与任务创建【七千字超详细指南】

大家好,我是早九晚十二,目前是做运维相关的工作。写博客是为了积累,希望大家一起进步! 我的主页:早九晚十二 文章目录什么是jenkins?jenkins的功能依赖环境使用docker快速搭建查看版本下载jenkins镜像使用d…

搞个网站需要多少钱【网站费用】

想搞一个网站,我们先了解一下搞个网站需要多少钱?网站建设费用主要包括:网站搭建、服务器费用(有些是免费的)、域名费用以及其他杂费。对于刚成立网站我们可以选择用自助建站方案来进行搭建网站,因为我们自…