消息队列以及Kafka的使用

什么是消息队列

消息队列:一般我们会简称它为MQ(Message Queue)。其主要目的是通讯

ps:消息队列是以日志的形式将数据顺序存储到磁盘当中。通常我们说从内存中IO读写数据的速度要快于从硬盘中IO读写的速度是对于随机的写入和读取。但是对于这种顺序存储的形式,在磁盘和内存中的操作速度是差不多的。

消息队列的作用

消息队列的三个主要作用:异步、削峰、解耦(很重要)。

我们以张三给李四送货物为例来形象的解释一下这三个作用。

在没有引入消息队列之前这个任务需要张三和李四两个人见面并进行货物的提交,引入消息队列之后相当于在两人之间多了一个快递站。张三把货物放到快递站,李四有时间的时候再去快递站取走快递即可。消息队列就相当于上述例子中的快递站。

异步:在没有快递站之前,两人完成货物的提交必须要两人见面,但是在引入快递站(消息队列)后,无需两人必须见面,张三将货物放在快递站后,便可便可认为李四可以接收到货物,李四在一个自己合适的时间去快递站取走货物便可完成货物的提交。

削峰:如果张三一次有很多货物要给李四提交,这会使得李四一次拿走这么多货物的压力很大。但是有了快递站(消息队列)后,李四可以一部分一部分的慢慢拿走货物。

解耦:再引入快递站之前,货物提交的操作对两人的要求是必须约定好时间两人同时到场才能执行,在引入快递站之后。张三可以把货物放下快递站,李四可以选择时间去拿走货物。二者的耦合度降低。

传统的流程设计与采用消息队列后的对比

传统的设计模式如下图,属于经典的串行化调用。这种设计模式的优势在于,代码简单,出现问题时容易定位到问题

但是,我们从高性能,高并发,高可用这三个方面去评价一下这个设计会发现它存在许多劣势。

  • 高性能:由于串行化的设计,业务的处理需要从上到下一步一步执行。假设每次网络传输耗时200ms,业务处理需要20ms,完成上面那些操作需要耗时2s,对于用户来说等待时间过长,用户体验也会很差,如果用户下单后的操作越来越多,耗时只会越来越高。
  • 高并发:

    这些操作都是由一个线程(主线程)去执行这些操作,所以当我们的QPS(系统每秒钟收到的请求)如果很高的话,很容易造成超时。

  • 高可用:这些服务假如有一个服务挂掉(宕机或者网络波动),就意味着我这个请求失败了,这样用户体验会极差,用户会频繁看到支付失败。

在引入消息队列后,流程如下所示

用户下单后,将相关信息放入消息队列当中,其他业务可以同时从消息队列中拿到相关信息进行处理。其中用户下单环节进行消息的生产,被称作生产者(producer)。而右侧调用的各种业务来接收消息,被称作消费者(consumer)

我们接着从高性能,高并发,高可用这三个方面去评价引入消息队列后的设计。

  • 高可用:当我系统里的一个模块宕机了,不会影响到我其他服务。(可以通过数据补偿或者分布式事务来保证数据最终一致性)

  • 高性能:用户下单,将下单所需要的数据都放到消息队列里,就直接返回了,所有耗时相当于就是网络传输所耗时。

  • 高并发:由于消息队列不处理任何业务上的逻辑,所有他支持的并发是百万级别的。假如有100万个用户下单,100万的数据放到消息队列里,连接消息队列的服务慢慢消费即可,也不至于造成瞬间有百万请求进来,将我的服务压垮。

消息队列的优缺点

优点

  1. 解耦:就像高可用里面说的一样,发淘金币服务挂了,关下单什么关系,发淘金币服务挂了,我还是可以正常下单,只不过后期可以数据补偿或者分布式事务去解决这个问题。
  2. 削峰:比如说我平时服务就只能支撑几万的qps,像淘宝京东那种秒杀,那时候服务突然打进来,那服务就会直接被压死了。但是如果采用消息队列,这秒杀进来的所有的请求都不会直接打到具体服务上,都会先打到消息队列里,然后我后面的服务再慢慢消费。(可以看看淘宝京东双11秒杀的时候,是不是有的时候慢是慢了点,但是服务起码没挂。等我秒杀结束之后,服务还能正常运转。)
  3. 异步:连接消息队列的服务可以异步去执行。而且每次多增加一个步骤,我下单的代码是不需要动的,只需要再增加一个消费者即可。

缺点

1,增加了系统复杂性。

所以说如果说你的业务量不大,并发也不高,就没必要使用消息队列。

2,事务问题。

事务问题其实是分布式系统肯定会存在的一个问题,只不过消息队列更严重一些。也就是说用了消息队列就代表接受了不实时性,只需要保证最终一致性就行了。一般解决方案有两种,第一种就是采用分布式事务,这个下单的里涉及的所有服务放到一个事务里面,要么都成功,要么都失败。第二种就是,消费者做好合理的数据补偿措施,比如说,消息重试,人工刷数据等等。

3,可用性

刚才讲了解耦,其实是系统的各个模块之间的解耦,但是这些模块都和消息队列关联,万一消息队列挂了,就真的下不了单了。为了保证可用性,我们可以采用消息队列集群,前端流量限流等。

常见的消息队列

springboot使用kafka

引入依赖

   <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency>

配置application.yml文件

  kafka:bootstrap-servers: 自己的ipconsumer:group-id: myname

生产者类


@RestController
public class KafkaController {@Resourceprivate KafkaTemplate kafkaTemplate;@GetMapping("/produce")public String produce(String message){kafkaTemplate.send("order",message);return "消息发送成功";}
}

消费者类

@Component
public class KafkaListener {@org.springframework.kafka.annotation.KafkaListener(topics = {"order"})public void listen(ConsumerRecord<String,String> record){System.out.println("卡夫卡推送的消息:"+record.value());System.out.println("我已经收到消息!!");}
}

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

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

相关文章

2024年:AI领航研发新纪元

导言&#xff1a; 在21世纪的科技巨浪中&#xff0c;人工智能&#xff08;AI&#xff09;已经崭露头角&#xff0c;成为研发领域的核心变革者。其强大的潜力和无所不在的应用正在改变人类解决问题的方式&#xff0c;为未来的发展开启了无限可能。随着机器学习、自然语言处理、计…

周立功USBCAN-E-mini分析仪的安装测试笔记

一、介绍 USBCAN-E-mini 智能 CAN 接口卡是系列 USBCAN 便携版本&#xff0c;与 USBCAN—E-U 单路智能 CAN 接口卡完全兼容。USBCAN-E-mini 智能 CAN 接口卡与 USB1.1 总线兼容的&#xff0c;集成 1 路 CAN 接口的智能型 CAN-bus 总线通讯接口卡。采用 USBCAN-E-mini 智能 CAN …

6、string字符串拼接

#include <iostream> using namespace std;void test01 () {string s1 "我";s1 "爱玩游戏";cout << s1 << endl;s1 :;string s2 "lol dnf";s1 s2;cout << s1 << endl;string s3 "i";s3.append(&q…

Vue 使用@别名

1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API&#xff0c;并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后&#xff0c;就可以导入nodejs的 path模块&#xff0c;在下面代码 import pat…

【ICCV】AIGC时代下的SOTA人脸表征提取器TransFace,FaceChain团队出品

一、论文 本文介绍被计算机视觉顶级国际会议ICCV 2023接收的论文 "TransFace: Calibrating Transformer Training for Face Recognition from a Data-Centric Perspective" 论文链接&#xff1a;https://arxiv.org/abs/2308.10133 开源代码&#xff1a;https://an…

GAMMA电源维修高压直流电源ES30P-5W ES系列

美国Gamma高压电源维修型号&#xff1a;D-ES30R-10N-5W/M&#xff0c;LXR30-1N&#xff0c;XRM5N-100W&#xff0c;ES50P-10W/DDPM&#xff0c;ES60P-10W/DDPM&#xff0c;RR20-20P/DDPM&#xff0c;ES30P-10W&#xff0c;ES60P-10W DDPM&#xff0c;RR60-18P/220V&#xff0c;…

快看!提高效率,还得看工作流表单引擎

经常有客户会问我们&#xff1a;究竟用什么样的工具才能打破信息孤岛&#xff0c;让大家互联联络起来&#xff1f;其实&#xff0c;说到这&#xff0c;有不少人会联想到低代码技术平台。不错&#xff0c;在快节奏的发展社会中&#xff0c;高效率的办公目的已经是大家的追求和发…

java的参数传递机制(引用类型)

1.除了非引用类型的形参传递&#xff0c;还有引用类型的变量形参传递&#xff0c;但引用类型的形参变量传递与非引用类型是不同的&#xff01;&#xff01;&#xff01; public class MethodDemo2 {public static void main(String[] args) {int[] arr new int[]{10,20,30,9}…

未来仓储解决方案:深入了解自动码垛托盘分配技术

在现代物料处理过程中&#xff0c;自动码垛托盘&#xff08;栈板&#xff09;分配机扮演着至关重要的角色。这类设备被广泛应用于制造业、物流仓储等领域&#xff0c;凭借其高效、准确且可靠的性能&#xff0c;成为提高生产效率和降低运营成本的关键工具。 自动码垛托盘分配机…

0-超详细基础安装linux系统-kali

软件以及kali镜像获取 vm 链接&#xff1a;https://pan.baidu.com/s/1u5Kfc6FVc_1awIHECVXh-Q?pwde963 提取码&#xff1a;e963 kali 链接&#xff1a;https://pan.baidu.com/s/1TeGXkwFKrpz9aUL8k2ff2g?pwdhu3v 提取码&#xff1a;hu3v 1.打开虚拟机选择新建虚拟机 安…

MySQL常见的存储引擎介绍

我将为您详细讲解 MySQL 常见的存储引擎&#xff0c;以及它们的使用场景、特点、区别和优势。MySQL 支持多种存储引擎&#xff0c;每种存储引擎都有其特定的优势和局限性。了解这些存储引擎的特点和适用场景对于选择合适的存储引擎以及优化数据库性能至关重要。 1. InnoDB 存储…

pytorch续写tensorboard

模型训练到一半有 bug 停了&#xff0c;可以 resume 继续炼&#xff0c;本篇给出 pytorch 在 resume 训练时续写 tensorboard 的简例&#xff0c;参考 [1-3]&#xff0c;只要保证 writer 接收的 global step 是连着的就行。 Code import numpy as np from torch.utils.tensor…

【算法刷题】Day30

1. 汉诺塔问题 原题链接 题干&#xff1a; 算法原理&#xff1a; 利用递归算法 将x柱子上的一堆盘子&#xff0c;借助 y柱子&#xff0c;转移到z 柱子上面 递归函数流程&#xff1a; 当前问题规模为 n1 时&#xff0c;直接将 A 中的最上面盘子挪到 C 中并返回递归将 A 中最…

C++ Qt开发:QFileSystemModel文件管理组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QFileSystemModel组件实现文件管理器…

开关电源安规测试标准与测试要求

安规测试是对开关电源进行电气性能、安全性能等检测&#xff0c;确保开关电源符合规定并且安全可靠&#xff0c;为开关电源的质量把关。那么开关电源安规测试有哪些测试要求和标准呢&#xff1f; 开关电源安规测试要求 一、测试前 1. 首先&#xff0c;要检查测试环境&#xff0…

游泳——所须知的那些事

游泳是一项大家喜爱的健身活动&#xff0c;带夏季的时候游泳场所成了大家常去的休闲活动场地&#xff0c;但也会存在一定的安全风险&#xff0c;为了保证游泳的安全&#xff0c;需要知道一些事情&#xff1a; 1.清楚的知道游泳池的深度 大部分游泳场馆的泳池是有深浅区的&…

第四篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas生物信息学领域应用

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas生物学数据操作应用介绍二、数据加载与清洗示例代码三、数据分析与统计示例代码四、数据可视化示例代码五、基因组数据分析示例代码六、蛋白质数据分析示例代码七、生物医学图像…

STM32/GD32——电源管理单元PWU

芯片选型 Ciga Device — GD32F470系列 PWU介绍 PMU全称Power Management Unit&#xff0c;电源管理单元。 电源域 总共有三大电源域&#xff0c;包括VDD / VDDA域&#xff0c;1.2V域和备份域。 VDD/VDDA 域 提供PMU 常规电源供应以下模块的供电&#xff1a; 看门狗主频晶…

Spring笔记——Bean的生命周期

Spring其实就是一个管理Bean对象的工厂&#xff0c;它负责对象的创建&#xff0c;对象的销毁等。生命周期的本质是&#xff1a;在哪个时间节点上调用了哪个类的哪个方法。我们可能需要在某个特殊的时间点上执行一段特定的代码&#xff0c;因此要了解在这个生命线上有哪些特殊时…

YoloV8改进策略:Block改进|自研Block,涨点超猛|代码详解|附结构图

涨点效果 涨点效果:在我自己的数据集上,mAP50 由0.986涨到了0.993,mAP50-95由0.737涨到0.757,涨点明显! 参考模型 参考的Block,如下图: 我对Block做了修改,修改后的结构图如下: 代码详解 from timm.models.layers import DropPathfrom torch import Tensor def …