Rocketmq 概述消息队列的应用场景

Message Queue (消息 队列),从字⾯上理解:⾸先它是⼀个队列。 FIFO 先进先出的数据结构—— 队列。消息队列就是所谓的存放消息的队列。
消息队列解决的不是存放消息的队列的⽬的,解决的是通信问题。

先来看看没有使用消息队列微服务之间调用的场景 

在订单系统里面,描述的是一个大致的流程,上面是没有消息队列介入订单系统的样子。

对于用户来说,下订单这个这个动作完成之后,需要看到的是下单成功这样一个提醒。再之后是支付这个步骤。用户是不需要知道在下完单之后,整个后台发生了哪些动作。

对于用户来说只需要看到下单成功这个提醒就ok了。下单成功后台会发生这几个步骤。创建订单,扣减库存,加积分,派发优惠券。这里只是列举了部分,其实还有很多服务被调用。

在微服务里面,上面创建订单,扣减库存等会被拆分为独立的服务来做,肯定不是在单体的项目里面,不会作为一个项目而存在,而是每一个部分会作为独立的项目而存在。换句话说这些项目会部署在不同的服务器上面。这就涉及到不同的服务的调用。

对于下订单这个服务来说,需要调用很多的服务来完成他的这个业务。那么这个调用是同步进行的还是异步进行的?

上面图是同步的通信,就是没有使用消息队列的通信方式。当用户下完订单之后,它会去调用创建订单这个动作,这个动作执行完之后会去调用另外一个服务扣减库存。注意这里每个服务调用完之后才会去调用另外一个服务。

也就是说下订单到下单成功,需要将创建订单,扣减库存,加积分,派发优惠券这几个服务执行完才会提示用户下单成功。

用户在下单再到下单成功,那么对用户来说必须得等待这几个服务的逐一完成,最后才能看到下单成功这个提示。

创建订单需要执行300毫秒的时间,扣减库存.......以此类推。当用户下单再到看到下单成功,这个需要经过这些服务调用累加的过程。这个时间是比较长的。

这里也涉及到网络通信,因为网络是不可靠的,如果网络抖动非常严重,就可能让这次调用的时间变的非常长。更严重的是网络抖动导致服务根本调用不到,那么在整个服务的调用链上面,是有很多服务需要调用,不敢保证每个服务都是快速调用的。所以用户下单这件事情就变的没有那么的容易。

所以同步的通信并不适合在订单系统里面出现,对用户体验感非常差。下单成功需要一段时间,而不是立刻马上。同时想下单成功也变成了概率的事件,下单成功可能只要80%概率。所以这里有两个问题性能不够ok,其次它的成功率也不够高。

使用消息队列能够帮我们解决什么样的问题?

使⽤异步的通信⽅式对模块间的调⽤进⾏解耦,可以快速的提升系统的吞吐量。上游执⾏完消息的发送业务后⽴即获得结果,下游多个服务订阅到消息后各⾃消费。
通过消息队列,屏蔽底层的通信协议,使得解藕和并⾏消费得以实现。

用户下单到想看到下单成功这个提醒,它的时间是比较久的,也就是它的接口响应速度是非常慢的。

如何提高响应的时间和提高成功率。比如买个东西还会提示下单失败。

在这中间引入了一个中间者消息队列。先不看消息队列的工作逻辑,先来看看效果。

完成下订单这个动作会往消息队列里面发送一条消息。这个消息可以理解为消息队列里面一条传递信息的个体。这个消息进来之后,不管什么逻辑,这个下订单这个动作可以马上返回一个结果,就是下单成功了。它能够得到一个马上下单成功的提醒。

这一下就可以解决两个问题,一个问题是它的速度非常的快,不需要等待所有的业务执行完才返回而是只发一条消息到消息队列马上就能够得到一个结论下单成功。

对于业务的上游来说,一下子就将两个问题解决了。第一个就是响应的时间,只需要一个发送消息的时间。其次不存在失败的问题,除非消息队列本身出现了问题。但是在消息队列本身会去做高可用。所以几乎不会存在下单失败这个问题。

下单成功对于用户来说很简单,然后去做支付动作。但是对于业务本身来说依然需要去创建订单,扣减库存,加积分,优惠券。它怎么做这些事情,当然需要去订阅这样一个队列。

下单紫色的圈就是这个消息,消息体里面包含了很多信息,每个业务订阅者这个队列他们都能够得到这个消息。得到这个消息就可以去做自己的事情了,比如创建订单,扣减库存等等.......在执行业务的时候数据都在消息里面。业务逻辑需要的数据都在这个消息里面可以拿到。

在此期间各个业务模块相互不影响,因为每个微服务几乎同时得到这个消息对象的。它们几乎就可以同时的工作。对于下游来说,可以顺利的得到消息对象,并且可以顺利的完成他的业务,这样就ok了。

总结

在未出现消息队列的时候,这些服务的调用是同步的过程,当出现了消息队列之后会发现已经变成了异步的过程。

异步的过程在于提高整个系统的吞吐量。只要消息发送到队列,那么就得到应该Ok的指示。对于上游来说就可以很快的结束业务。

对于下游来说,既然已经在消息队列里面了,那么下游可能就不那么追求实时性。不是要立刻执行完才算下单成功,下游拿到这些消息了可以慢慢的,不追求实时的消费,但是可以将消息逐一的进行处理。

允许异步的不实时的场景出现。可能在用户进行支付的时候,这些东西都已经创建好了。

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

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

相关文章

rancher搭建k8s及jenkins自动化部署

1、准备环境 角色IP用途k8s-rancher-master192.168.3.63master节点k8s-rancher-node01192.168.3.64node节点k8s-rancher-node02192.168.3.66node节点k8s-rancher-server192.168.2.33rancher-server节点注: 服务器名需要配置不同,相同服务器名不能加入node节点 在所有节点进行…

海外直播对网速、带宽、安全的要求

要满足海外直播的要求,需要拥有合适的网络配置。在全球化的浪潮下,海外直播正逐渐成为企业、个人和各类组织的重要工具。不论是用于市场推广、品牌宣传,还是与观众互动,海外直播都为参与者带来了丰富的机会。然而,确保…

【小项目】python贪吃蛇小游戏设计

引入pygame库 添加pygame库,在cmd中输入以下代码,进行安装。如果输入pip install pygame出现以下报错,可以尝试在前面加入python3 -m。 python3 -m pip install pygame 贪吃蛇代码 import pygame import time import random# 初始化 Pygam…

【原创】java+springboot+mysql学生信息管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

IQ Tools---Radar Pulses/Chirps

本文将详细介绍IQ Tool中的Radar Pulses/Chirps模块的使用方法和实现原理。 1. 参数配置 图1. Radar Pulses/Chirps参数配置界面 该模块可配参数如下:   (1) Sample Rate(Hz): 系统采样率,单位:Hz   (2) Repeat interval(s): 脉冲重复周期&#xff…

数据库类型有哪些?

根据存储方式的不同,数据库可以分为不同种类。每种类型的数据库,都有各自使用场景以及不同的产品。 ​ 关系型数据库 关系型数据库(RDBMS)基于关系模型,通过表(Table)的形式来组织数据&#xf…

java中普通代码块和静态代码块之间的区别(java小知识点)

文章目录 1.普通代码块(实例代码块)1.1用法 2.静态代码块2.1用法 3.总结 1.普通代码块(实例代码块) 实例代码块是一段未包含在任何方法或构造器中的代码。它再每次创建类的实例时候执行,并且优先于构造器执行. 用途一般…

照片删除了怎么恢复回来?要学会这些数据恢复方法

在数字化时代,照片已经成为我们记录生活、珍藏回忆的重要载体。然而,有时由于误操作或其他原因,我们可能会不小心删除了重要的照片。面对这种情况,很多人会感到焦虑和无助。幸运的是,有多种方法可以帮助我们恢复删除的…

【项目功能扩展】在线网站 -用户管理功能(用户注册登录修改等、利用cookie存储用户会话状态)

文章目录 0. 前言开发环境 & 涉及技术 1. 宏观结构2. 后端部分① sqlite 管理类② user 管理类 3. 前端部分(与后端交互)① 登录② 注册③ 查看登录用户的信息④ 更新用户信息⑤ 登出用户 & 注销用户注意 效果演示 0. 前言 源码链接&#xff1a…

Java | Leetcode Java题解之第391题完美矩形

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isRectangleCover(int[][] rectangles) {long area 0;int minX rectangles[0][0], minY rectangles[0][1], maxX rectangles[0][2], maxY rectangles[0][3];Map<Point, Integer> cnt new HashM…

Python AttributeError: ‘dict_values’ object has no attribute ‘index’

Python AttributeError: ‘dict_values’ object has no attribute ‘index’ 在Python编程中&#xff0c;AttributeError 是一个常见的异常类型&#xff0c;通常发生在尝试访问对象没有的属性或方法时。今天&#xff0c;我们将深入探讨一个具体的 AttributeError&#xff1a;“…

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

ML19_GMM高斯混合模型详解

1. 中心极限定理 中心极限定理&#xff08;Central Limit Theorem, CLT&#xff09;是概率论中的一个重要定理&#xff0c;它描述了在一定条件下&#xff0c;独立同分布的随机变量序列的标准化和的分布趋向于正态分布的性质。这个定理在统计学中有着广泛的应用&#xff0c;尤其…

高通智能模组:以卓越优势引领科技潮流

一、高通智能模组的崛起与发展 在通信技术发展中&#xff0c;高通智能模组出现。5G 兴起&#xff0c;对模组有更高要求&#xff0c;高通凭借积累和创新捕捉需求。早期致力于研发 5G 技术&#xff0c;优化技术降低功耗提高处理能力&#xff0c;展现性能优势。在竞争中&#xff0…

黑豹X2(Panther-x2)刷机并驱动NPU/VPU、Jellyfin转码

文章目录 零、前言一、刷机1、下载所需文件2、开始刷机 二、连接SSH并初始化1、连接SSH2、初始化换源安装蓝牙模块驱动安装一些包检查驱动 三、安装Docker和Jellyfin1、安装Docker安装Docker Compose 2、安装Jellyfin3、配置转码 四、NPU的驱动&#xff08;可选&#xff09; 零…

消息队列 MQ 性能大揭秘

RabbitMQ 以下是rabbitmq官方针对RabbitMQ 3.12的性能测试报告&#xff0c;从报告中可以看到他测试的吞吐量是保持在万级的&#xff0c;延迟时间平均在25毫秒左右&#xff0c;最小延时可以达到微秒级。 另外图中还可以看到在低吞吐量的情况下rabbitmq的延迟速度非常的快&…

QT Creater实现国庆节主题项目【0基础完成版】

本文适用对象 想要学习qt creater的小白;想要学习c++制作软件的编程爱好者。可以先下载这篇博客绑定的资源,然后一边操作,一边学习,会更高效~0. 创建初始项目 一步步来操作吧,首先下载qt creter,之前发布过相关资源,大家直接查找下载,或者自行下载。 1. 初始代码 mai…

RabbitMQ 04 集群,用于提高系统性能

01.背景 02.单个节点的MQ会持久化的记录什么数据 03.集群情况下的MQ会持久化的记录什么数据 04.集群中的队列 单个节点的队列&#xff1a; 集群的队列&#xff1a; 05. 两个原因&#xff1a; 这样做带来的好处&#xff1a; 05.集群的交换机 交换机的本质 交换机在集…

VS Studio2022 最新的mission planner二次开发环境搭建 所有资源都在自己亲测 自己一步步搞出来的花了1个月(小白转行版

文章目录 1. 环境要求1.1 VS Studio下载1.2 Mission Planner2 Mission Planner打包msi(使用使用VisualStudio2022插件(Visual Studio Installer Projects 2022))3 打开设计器FlightData.cs1. 环境要求 Win10以上(目前实测了11,10也可以的) 1.1 VS Studio下载 VS Studio20…

C语言文件操作超详解

文章目录 1. 为什么使用文件2. 什么是文件2. 1 程序文件2. 2 数据文件2. 3 文件名3. 二进制文件和文本文件? 4. 文件的打开和关闭4. 1 流和标准流4. 1. 1 流4. 1. 2 标准流 4. 2 文件指针4. 3 文件的打开和关闭 5. 文件的顺序读写5. 1 顺序读写函数介绍5. 2 对比一组函数: 6. …