消息队列以及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,一经查实,立即删除!

相关文章

SQL 中 IN 与 <= 且 >= 的效率比较

1. 索引利用 当查询条件中的值是离散的、非连续的&#xff0c;或者是在多个不相邻的范围内时&#xff0c;使用 IN 可以更高效&#xff0c;因为 IN 可以直接跳到索引中的这些特定值。而 < 且 > 通常用于连续范围的查询&#xff0c;如果查询的是一个连续的区间&#xff0c…

2024年:AI领航研发新纪元

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

模型精度fp16和fp32

FP16和FP32是两种不同的浮点数精度格式&#xff0c;在计算机科学特别是深度学习领域中广泛应用。 FP32&#xff08;单精度浮点数&#xff09;&#xff1a; FP32代表32位&#xff08;4字节&#xff09;单精度浮点数格式&#xff0c;这是传统上大多数深度学习模型训练和推理的标准…

代码随想录算法训练营第五十四天|392.判断子序列、115.不同的子序列

392.判断子序列 思路&#xff1a;判断子序列的问题&#xff0c;其实与最大公共子序列的问题是一样的&#xff0c;所以基本上写出来是一样的&#xff0c;但是今天又犯了一个错误&#xff0c;对于非连续子序列&#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 …

【Linux】Linux操作命令—最全版

目录 一、Linux下基本指令 01. ls 指令 02.cd 指令 03.touch指令 04 mkdir指令 05 man指令 06 cp指令 07 mv指令 08 cat指令 09 more指令 10 less指令 11 head 命令 12 tail 命令 二、时间相关的指令 01 date显示 1.在显示方面&#xff0c;使用者可以设定…

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;收款码作为连接线上支付与线下商业活动的重要桥梁&#xff0c;已成为众多商家的必备工具。然而&#xff0c;对于初次接触收款码的商家来说&#xff0c;如何申请、需要准备哪些材料以及申请流程需要多长时间等问题&#xff0c;往往成为他们关注…

nginx 端口转发8848的nacos,达到不暴露nacos端口进行web访问nacos

一些客户端原因&#xff0c;云主机未开放8848端口&#xff0c;我们无法直接访问8848/nacos&#xff0c;进行nacos的配置 方法&#xff1a; 以docker启动的nginx和nacos(2.0.3)为例 配置nginx 80端口&#xff0c;配置转发到内网的IP和8848端口&#xff0c;172.17.0.1为docker…

Golang单例模式学习笔记

前言 单例模式是常用的一种设计模式&#xff0c;一般用于比如客户端、连接的创建等&#xff0c;防止创建多个导致性能消耗。所以我认为单例模式的核心&#xff0c;就是“防止重复”。本文将在Golang中进行单例模式的实现。 实现 版本1——检测-创建 最基础的版本&#xff0…

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

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

开发一个带有Servlet的webapp(重点)

【具体步骤如下】 ①在webapps目录下新建一个目录&#xff0c;起名crm&#xff08;这个crm就是webapp的名字&#xff09;。当然&#xff0c;也可以是其他目录&#xff0c;名字自拟 注意&#xff1a;crm就是这个webapp的根 ②在webapp的根下新建一个目录&#xff1a;WEB…

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…