消息队列作用(解耦、异步、削峰)

原文:消息队列作用(解耦、异步、削峰)图详解

一、消息队列简介

简单来说,“消息队列”是在消息的传输过程中保存消息的容器。

  • MQ 全称为 Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信。
  • 消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合异步消息流量削锋等问题

二、解耦

  • 传统做法

    • 传统的做法是,订单系统调用库存系统的接口。如下图:

      img
    • 传统模式的缺点:假如库存系统无法访问,则订单减库存将失败,从而导致订单失败,订单系统与库存系统耦合。

如何解决以上问题呢?

  • 使用消息队列

    • 引入应用消息队列后的方案,如下图:

      img
    • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。

    • 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。

    • 在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦。

举个新例子:

比如说某一个系统 A 要与其他系统打交道(即调用其中的方法),如果其它系统改变或者新增系统,那么 A 系统都会改变,这样的话耦合度比较高,比较麻烦。

img

使用消息队列来解决这个问题。

我们 A 系统将产生的数据发入消息队列中,其它的系统再去消息队列来进行消费,那么其他系统的减少或者新增系统即与 A 系统关系不大了,这样来实现解耦的功能。

img

三、异步

场景说明:用户注册后,需要发注册邮件和注册短信。

  • 传统做法

    • a. 串行:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。

      img
    • b. 并行:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。

      img
  • 使用消息队列

    • 将不是必须的业务逻辑,异步处理。改造后的架构如下:

      img

举个新例子

某一个用户使用系统 A,但是 A 要调用系统 B、C、D,但是每一个系统返回的时间是不一样的,你必须要等待全部返回后才可以响应用户。

img

如果我们这里采用消息队列,当用户发送请求后,我们把数据传给消息队列,然后再直接响应给用户我已经发送了信息。

img

四、流量削峰

场景说明:商品秒杀业务,一般会因为流量过大,导致流量暴增,应用挂掉。

  • 传统做法

    • 限制用户数量。
  • 使用消息队列

    • 用户的请求,服务器接收后,首先写入消息队列,秒杀业务根据规则处理消息:

      img
    • 假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。

举个新例子

比如平常用户的请求我们会直接访问数据库,在大量用户过来的时候,这样的话我们会对数据库照常比较大的压力:

img

在这里我们增加一个消息队列,这样的话不管你请求来多少,我先存入消息队列,然后我再让系统慢慢的处理你的请求(如右图),这样很好的减缓了数据库的访问压力。

五、消息通讯

消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。

  • 使用消息队列实现点对点通信

    • 客户端 A 和客户端 B 使用同一队列,进行消息通讯:

      img
  • 使用消息队列实现聊天室通信

    • 客户端 A,客户端 B,客户端 N 订阅同一主题,进行消息发布和接收。实现类似聊天室效果:

      img

六、日志处理

日志处理是指将消息队列用在日志处理中,比如 Kafka 的应用,解决大量日志传输的问题。

  • 使用消息队列完成日志处理

    • 日志采集客户端,负责日志数据采集,定时写受写入 Kafka 队列

    • Kafka 消息队列,负责日志数据的接收,存储和转发

    • 日志处理应用:订阅并消费 kafka 队列中的日志数据

      img

七 . 使用消息队列带来的一些问题

1、系统可用性降低:

系统可用性在某种程度上降低,为什么这样说呢?在加入 MQ 之前,你不用考虑消息丢失或者说 MQ 挂掉等等的情况,但是,引入 MQ 之后你就需要去考虑了!

2、系统复杂性提高:

加入 MQ 之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题!

3、一致性问题:

我上面讲了消息队列可以实现异步,消息队列带来的异步确实可以提高系统响应速度。但是,万一消息的真正消费者并没有正确消费消息怎么办?这样就会导致数据不一致的情况了。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 链表

1. 前言 链表:不仅存储 当前元素的数据,还存储着 元素排列顺序 2. 正题 2.1 如何存储节点? 我们可以使用 结构体 数组来存储 链表节点 struct Node {int val; // 可以是 string 或其它复杂的类型int nxt; } node[N];Tip: 下标顺序不是单链表顺序val 代表 元素本身,nxt 代表…

WPF 模拟UWP原生窗口样式——亚克力|云母材质、自定义标题栏样式、原生DWM动画 (附我封装好的类)

先看一下最终效果,左图为使用亚克力材质并添加组合颜色的效果;右图为MicaAlt材质的效果。两者都自定义了标题栏并且最大限度地保留了DWM提供的原生窗口效果(最大化最小化、关闭出现的动画、窗口阴影、拖拽布局器等)。接下来把各部分的实现一个个拆开来讲讲。 一、使用窗口材…

Redis学习(一)

1.通用命令keys * del k1 exists k1 expipe k1 ttl k12.String类型String类型的常见命令 set k1 v1 添加键值对 get k1 v1 获得键值对对应的值 mset k1 v1 k2 v2 一次性设置多个值 mget k1 k2 k3 一次性获取多个键值对的值 incr k1 让k1自增 incrby k1 2 按步长2自增 dec…

C# WebSocket Fleck 源码解读

最近在维护公司旧项目,偶然发现使用Fleck实现的WebSocket主动推送功能,(由于前端页面关闭时WebSocket Server中执行了多次OnClone事件回调并且打印了大量的关闭日志,),后来我特地看了源码,这里做一些分享 github: https://github.com/statianzo/Fleck在源码中,作者在 Sam…

SuperCLUE整理

参考信息: git:https://github.com/CLUEbenchmark/SuperCLUE 官网:https://www.cluebenchmarks.com/superclue.html 23年7月论文 :https://arxiv.org/pdf/2307.15020: 24年4月报告:https://www.cluebenchmarks.com/superclue_2404 24年7月报告:https://www.cluebenchmar…

20240819编译 链接 单片机执行的第一个语句

2024年8月中旬在宝鸡出差,在B站上学习了下。 在linux操作系统中,gdb是调试器,gcc是编译器。 Linux 操作系统 将main.elf文件加载到内存中以后,操作系统为其分配进程,然后main函数就开始执行了。输入 layout asm 则显示出来汇编代码 键入 “starti”的时候 进入到程序里面的…

回溯part02

今天继续学习了回溯:组合求和的进阶 元素可以重复使用:backtracking(candidates, target, sum, i); // 不用i+1了,表示可以重复读取当前的数 数组去重:首先数组排序,然后使用used 分割回文子串问题,抽象为组合问题,注意如何判断是否是回文子串5. 39 组合总和(元素可重复…

2.系统定时器

系统定时器SYSTEM文件夹介绍1,sys文件夹介绍sys_nvic_set_vector_table():设置中断向量表地址sys_intx_enable():开启所有中断sys_intx_disable():关闭所有中断(但是不包括fault和NMI中断)sys_wfi_set():执行: WFI指令(执行完该指令进入低功耗状态)sys_standby():进入待机…

Terraform - 初解Terraform - 安装

开发环境配置 Note:安装环境为windows系统64位笔记本电脑 1.安装适用于 Windows 的 Terraform: https://developer.hashicorp.com/terraform/install 2.下载 Terraform: https://releases.hashicorp.com/terraform/1.9.4/terraform_1.9.4_windows_amd64.zip 3.从下载中,将…

python 05-标准库:csv、json、sqlite3、datetime模块

csv模块import csv# data.csv不存在时,会现在当前目录下创建一个data.csv文件 with open("data.csv", "w", encoding=utf-8) as file:writer = csv.writer(file)writer.writerow(["trasanction_id", "product_id", "price_id&qu…

初识方法

1.方法是什么 1.java方法是语句的合集,放在一起执行一个功能。 2.方法包含于类或对象中 3.方法在程序中被创建,在其他地方被引用 2.方法的原则:原子性 一个方法只能完成一个功能 3.在main方法外计算 1.先在main外面书写一个加法方法2.再在main里面直接输出加法方法总览: