当前位置: 首页 > news >正文

64.微服务保姆教程 (七) RocketMQ--分布式消息中间件

RocketMQ–分布式消息中间件

一、MQ

1、什么是MQ

MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队列拉取消息,或者订阅相应的队列,由MQ服务端给其推送消息。

2、MQ的应用场景

消息队列在实际应用中常用的使用场景有异步处理,应用解耦,流量削锋和消息通讯。

1、异步处理

场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种:串行的方式和并行方式。

串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户。
在这里插入图片描述

并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。

在这里插入图片描述

假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒。

因为CPU在单位时间内处理的请求数是一定的,假设CPU1秒内吞吐量是100次。则串行方式1秒内CPU可处理的请求量是7次(1000/150)。并行方式处理的请求量是10次(1000/100)。

小结:如以上案例描述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题呢?

引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:

在这里插入图片描述

按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。因此架构改变后,系统的吞吐量提高到每秒20QPS。比串行提高了3倍,比并行提高了两倍!

2、应用解耦

场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图:

在这里插入图片描述

传统模式的缺点:

假如库存系统无法访问,则订单减库存将失败,从而导致订单失败,订单系统与库存系统耦合。

如何解决以上问题呢?引入应用消息队列后的方案,如下图:

在这里插入图片描述

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

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

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

3、流量削锋

流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛!

应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。

可以控制活动的人数,可以缓解短时间内高流量压垮应用。

在这里插入图片描述

用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。

秒杀业务根据消息队列中的请求信息,再做后续处理。

4、消息通讯

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

点对点通讯:

在这里插入图片描述

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

聊天室通讯:

在这里插入图片描述

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

3、几大常见MQ产品比较

市场上比较常见的 MQ 产品有 ActiveMQ、RabbitMQ、RocketMQ 和 Kafka。

在这里插入图片描述

二、RocketMQ

1.什么是RocketMQ

RocketMQ是阿里巴巴开源的一款高性能、高吞吐量的分布式消息中间件,RocketMQ使用Java语言开发,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。

2.RocketMQ 特点

1.支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型

2.在一个队列中可靠的先进先出(FIFO)和严格的顺序传递 (RocketMQ可以保证严格的消息顺序,而ActiveMQ无法保证)

3.支持拉(pull)和推(push)两种消息模式

pull其实就是消费者主动从MQ中去拉消息,而push则像rabbit MQ一样,是MQ给消费者推送消息。但是RocketMQ的push其实是基于pull来实现的。
它会先由一个业务代码从MQ中pull消息,然后再由业务代码push给特定的应用/消费者。其实底层就是一个pull模式

4.单一队列百万消息的堆积能力 (RocketMQ提供亿级消息的堆积能力,这不是重点,重点是堆积了亿级的消息后,依然保持写入低延迟)

5.支持多种消息协议,如 JMS、MQTT 等

6.分布式高可用的部署架构,满足至少一次消息传递语义(RocketMQ原生就是支持分布式的,而ActiveMQ原生存在单点性)

7.提供 docker 镜像用于隔离测试和云集群部署

8.提供配置、指标和监控等功能丰富的 Dashboard

3 RocketMQ 优势

目前主流的 MQ 主要是 RocketMQ、kafka、RabbitMQ,其主要优势有:

支持事务型消息(消息发送和 DB 操作保持两方的最终一致性,RabbitMQ 和 Kafka 不支持)
支持结合 RocketMQ 的多个系统之间数据最终一致性(多方事务,二方事务是前提)
支持 18 个级别的延迟消息(Kafka 不支持)
支持指定次数和时间间隔的失败消息重发(Kafka 不支持,RabbitMQ 需要手动确认)
支持 Consumer 端 Tag 过滤,减少不必要的网络传输(即过滤由MQ完成,而不是由消费者完成。RabbitMQ 和 Kafka 不支持)
支持重复消费(RabbitMQ 不支持,Kafka 支持)

4、RocketMQ 核心组成部分

RocketMQ主要有四大核心组成部分:NameServerBrokerProducer以及Consumer四部分。

在这里插入图片描述

1、Name Server

NameServer是一个非常简单的Topic路由注册中心,其角色类似Dubbo中的zookeeper,支持Broker的动态注册与发现。

Name Server 主要包括两个功能:

  • Broker管理:NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;
  • 路由信息管理:每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。

Name Server 是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。任意一个 Name Server 包含所有集群的信息。

2、Broker

集群最核心模块,主要负责Topic消息存储、消费者的消费位点管理(消费进度);

Broker会注册到 Name Server上去,无论是否是主从, 每个 Broker 都会注册到 Name Server 上;

Broker部署相对复杂,Broker分为Master和Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的Broker Name,不同的Broker Id来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。

每个Broker 与Name Server集群中的所有节点建立长连接,定时(每隔30秒)注册Topic信息到所有Name Server。Name Server定时(每隔10秒)扫描所有存活的Broker连接,如果Name Server超过两分钟没有收到心跳。则Name Server断开与Broker 的连接。

每个 Broker 都会创建一个 consumerOffset.json 的文件,记录当前消费的节点指向了哪条消息,即消费的偏移量;偏移量是由 Consumer 上报的,Consumer 会定时或者 Kill 阶段提交各自对应 queue 的 offset 位置,为了避免消息的重复推送;consumerOffset.json 的文件格式:

**
在这里插入图片描述

3、producer

Producer 与 Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从Name Server中取Topic路由信息,并向提供Topic服务的Master建立长连接(基于 Netty),且定时向Master发送心跳。Producer 完全无状态,可集群部署。

Producer 每隔30秒(由ClientConfig的pollNameServerInterval)从Name Server 获取所有的Topic 队列的最新情况,这意味着如果Broker 不可用,Producer 最多30秒感知到。在此期间内发往Broker的所有消息都会失败。

Producer 每隔30秒 (由ClientConfig中heartbeatBrokerInterval决定) 向所有关联的 Broker 发送心跳,Broker 每隔10秒扫描所有存活的的连接,如果Borker 在2分钟内没有收到心跳数据,则关闭与Producer的连接。

4、Consumer

Consumer 与 Name Server 集群中的其中一个节点(随机选择)建立长连接,定期从Name Server 取 Topic 路由信息,并向提供Topic 服务的Master、 Slave 建立长连接(基于 Netty)且定时向 Master、Slave 发送心跳。Consumer 既可以从Master 订阅消息,也可以从Slave 订阅消息,订阅规则由 Broker 配置决定。

Consumer 每隔30秒 从Name Server 获取Topic 的最新队列情况,这意味着Broker 不可用时,Consumer 最多需要30秒 即可感知。

Consumer 每隔30秒(由ClientConfig中heartbeatBrokerInterval决定)向所有关联的Broker 发送心跳,Broker 每隔 10 秒扫描所有存活的连接,若某个连接2分钟内没有发送心跳数据,则关闭连接;并向该Consumer Group 的所有Consumer发出通知,Group内的所有Consumer 重新分配队列,然后继续消费。

当Consumer得到 Master 宕机通知后,转向Slave 消费,Slave 的消息不对保证100%都同步过来了,因此会有少量的消息丢失。但是一旦Master 恢复,未同步过去的消息会被最终消费掉。

消费者队列是消费者连接之后(或之前连接过)才创建的。我们将原生的消费者标识由{IP}@{消费者group}扩展为 {IP}@{消费者group}{topic}{tag},(例如xxx.xxx.xxx.xxx@mqtest_producer-group_2m2sTest_tag-zyk)。任何一个元素不同都认为是不同的消费端,每个消费端会拥有一份自己的消费队列(默认是Borker队列数量*Broker数量)。新挂载的消费都队列中拥有CommitLog 的所有数据。

5、RocketMQ消息模型的术语

a) 消息:消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。

b) 主题:Topic表示一类消息的集合,每个主题包含若干消息,是RocketMQ进行消息订阅的基本单位。一个发送者可以发送消息给一个或者多个Topic;一个消息接受者可以订阅一个或多个Topic消息;

c) 标签:为消息设置的标签,用于将同一个topic下区分不同类型的消息,可以理解为Topic是消息的一级分类,Tag是消息的二级分类。

d) 队列:存储消息的物理实体,一个Topic可以包含多个Queue,Queue也叫消息分区,一个Queue中的消息只能被一个消费者组中的一个消费者消费,一个Queue中的消息不允许同一个消费者组中的多个消费者同时消费。每个 Topic 在创建之初都会默认创建 4 个队列(queue-0,queue-1,queue-2,queue-3),每个队列都会对应一个持久化的文件;Producer 向 Broker 上的 Topic 发送消息,若发现队列没有创建持久化的文件,则会创建相应的持久化文件 queueLog,queueLog 记录的每条消息在 CommitLog 中的位置等信息。

e) 消息标识
RocketMQ中每个消息都有唯一的消息ID,且可以携带具有业务标识的key,以便对消息的查询。

f) 组(Group),可分为生产者组和消费者组:
生产者组:同一类Producer的集合,这类Producer发送同一类消息且发送逻辑一致。如果发送的是事务消息,且生产者发送后崩溃,则Broker服务器会联系同一个生产者组的其他生产者实例以提交或者回溯消费。
消费者组:同一类Consumer的集合,这类Consumer通常消费同一类消息且消费逻辑一致。消费者组使得在消息消费方面实现了负载均衡和容错。消费者组的消费者实例必须订阅完全相同的topic。

g) 偏移量:队列Queue中的offset,可以认为就是下标,消息队列可看做数组。

各角色之间的关系

Producer:消息的发送者;举例:发信者
Consumer:消息接收者;举例:收信者
Broker:暂存和传输消息;举例:邮局
NameServer:管理Broker;举例:各个邮局的管理机构
Topic:区分消息的种类;一个发送者可以发送消息给一个或者多个Topic

相关文章:

64.微服务保姆教程 (七) RocketMQ--分布式消息中间件

RocketMQ–分布式消息中间件 一、MQ 1、什么是MQ MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队…...

邀约媒体,邀请到场 多少钱?

传媒如春雨,润物细无声,大家好,我是51媒体胡老师。 在策划线下活动时,媒体邀约是提升品牌曝光度和影响力的重要环节。不同类型和规模的媒体邀约,其预算需求也各不相同。以下为各类媒体邀约的费用概览及影响因素&#…...

Android数据库全栈开发实战:Room+SQLCipher+Hilt企业级应用构建

简介 在移动应用开发中,数据库作为数据存储的核心组件,其安全性和性能对企业级应用至关重要。本文将从零开始,全面讲解Android数据库开发的最新技术,包括Room框架的深度使用、SQLCipher加密数据库的实现、Hilt依赖注入的集成以及前后端数据同步的完整方案。通过一个加密任…...

Kafka与RocketMQ在事务消息实现上的区别是什么?

一、Kafka事务消息核心实现&#xff08;基于2.8版本&#xff09; // KafkaProducer.java public synchronized Future<RecordMetadata> send(ProducerRecord<K, V> record) {// 事务消息校验&#xff08;第256行&#xff09;if (transactionManager ! null &&…...

Maven 依赖发布与仓库治理

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

hybird接口配置

【sw1】 [sw1]vlan batch 10 20 [sw1]int g 0/0/3 [sw1-GigabitEthernet0/0/1]port hybrid tagged vlan 10 20 [sw1-GigabitEthernet0/0/1]int g 0/0/1 [sw1-GigabitEthernet0/0/2]port hybrid pvid vlan 10 [sw1-GigabitEthernet0/0/2]port hybrid untagged vlan 10 20 …...

AI视频智能分析网关打造社区/工厂/校园/仓库智慧消防实现精准化安全管控

一、背景 随着社区、商业场所对消防安全要求日益提升&#xff0c;传统消防系统已难以满足智能化、精细化管理需求。智能分析网关融合物联网与人工智能技术&#xff0c;具备强大的数据处理与分析能力&#xff0c;可全面升级消防系统。将其融入消防系统各层级&#xff0c;搭建智…...

Web3 应用中常见的数据安全风险及防护措施

随着 Web3 技术的蓬勃发展&#xff0c;我们见证了一个全新的互联网时代的到来。Web3 应用以其去中心化、用户控制数据和透明性的特点&#xff0c;为用户提供了前所未有的体验。然而&#xff0c;这些应用在提供便利的同时&#xff0c;也带来了一系列数据安全风险。本文将探讨 We…...

免费视频压缩软件

一、本地软件&#xff08;支持离线使用&#xff09; 1. HandBrake 平台&#xff1a;Windows / macOS / Linux 特点&#xff1a;开源免费&#xff0c;支持多种格式转换&#xff0c;提供丰富的预设选项&#xff08;如“Fast 1080p”快速压缩&#xff09;&#xff0c;可自定义分…...

Java实用注解篇: @JSONField

前言 在 Java 开发中&#xff0c;进行对象与 JSON 的相互转换是一项常见操作&#xff0c;尤其在前后端分离的架构中显得尤为重要。Fastjson 作为阿里巴巴开源的 JSON 处理框架&#xff0c;因其高性能和强大功能而被广泛使用。JSONField 是 Fastjson 提供的一个注解&#xff0c;…...

浔川AI 第二次内测报告

浔川AI 第二次内测报告 执行社团&#xff1a;浔川社团官方联合会、总社团联合会 同意执行社团&#xff1a;总社团联合会 合作社团&#xff1a;暮烟社团官方联合会 合作分社团&#xff1a;浔川AI分社团、浔川AI分部 被执行内测程序&#xff1a;浔川AI 内测第二代 被执行内…...

React Hooks 深入浅出

目录 引言&#xff1a;React Hooks 的革命基础 Hooks useState&#xff1a;状态管理的新方式useEffect&#xff1a;组件生命周期的替代方案useContext&#xff1a;简化 Context API 额外的 Hooks useReducer&#xff1a;复杂状态逻辑的管理useCallback 与 useMemo&#xff1a;…...

解释 NestJS 的架构理念(例如,模块化、可扩展性、渐进式框架)

一、模块化设计 // user.module.ts Module({controllers: [UserController], // 当前模块的控制器providers: [UserService], // 当前模块的服务exports: [UserService] // 暴露给其他模块使用的服务 }) export class UserModule {}// order.module.ts Module({…...

Caffeine快速入门

依赖 <dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.2.0</version> </dependency> Cache的基本api操作 Caffeine.newBuilder.build来构建Caffeine .maximumS…...

【踩坑记录】项目Bug分析:一次因 `String.isBlank()` 引发的崩溃(No such instance method: ‘isBlank‘)

项目Bug分析&#xff1a;一次因 String.isBlank() 引发的崩溃 一、前言 在日常的 Java 项目开发中&#xff0c;使用 String 的常见工具方法如 isEmpty()、trim() 等已司空见惯。然而&#xff0c;近期在一次项目中使用了 String.isBlank() 方法&#xff0c;结果竟然直接导致崩…...

SpringBoot整合Kafka、Flink实现流式处理

引言 在当今大数据处理领域&#xff0c;实时数据流处理变得越来越重要。Apache Kafka作为一个高吞吐量的分布式流处理平台&#xff0c;结合Apache Flink这一强大的流处理框架&#xff0c;可以构建出高效的实时数据处理系统。本文将指导您如何在SpringBoot应用中整合Kafka和Fli…...

互联网大厂Java求职面试:云原生与AI融合下的系统设计挑战-2

互联网大厂Java求职面试&#xff1a;云原生与AI融合下的系统设计挑战-2 第一轮提问&#xff1a;云原生架构选型与微服务治理 面试官&#xff08;技术总监&#xff09;&#xff1a;郑薪苦&#xff0c;我们先从一个基础问题开始。你了解Spring Cloud和Kubernetes在微服务架构中…...

AI算力产业领域产品全景图:从硬件基础到应用场景

目录 1、硬件产品 2、 软件产品 3、云服务产品 4、边缘计算产品 5、AI应用产品 6、AI安全产品 7、AI合规产品 8、AI教培产品 9、AI研创产品 10、AI生态产品 在人工智能迅猛发展的今天,算力已成为推动AI技术进步与应用落地的核心驱动力。随着深度学习模型规模的不断膨…...

【优选算法 | 模拟】探索模拟算法: 编程与问题分析的双重 考验

算法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;双指针滑动窗口二分查找前缀和位运算 在本篇文章中&#xff0c;我们将深入解析模拟算法的原理。从基础概念到实际应用&#xff0c;带你了解如何通过模拟算法高效解决各种问题。无论你是刚接触算法的新手&#x…...

根据蓝牙名称自动匹配对应 UI

要实现“根据蓝牙名称自动匹配对应 UI”&#xff0c;并且支持未来不断增加的按摩椅型号和UI&#xff0c;推荐采用插件式UI注册自动路由的架构。下面是详细的可执行方案&#xff0c;适合你当前的 Flutter 项目结构&#xff1a; 1. 目录结构设计 假设每个按摩椅型号有独立的UI页…...

【25软考网工】第五章(7)路由协议、静态与默认路由、路由协议分类

目录 一、路由协议 1. 路由 2. 路由器工作原理 3. 查看路由表 4. IP路由查找的最长匹配原则 1&#xff09;例题#最长匹配原则示例题 5. 应用案例 1&#xff09;例题#路由优先级判断 2&#xff09;例题#路由信息内容 3&#xff09;例题#路由表迭代与静态路由 4&#…...

Rice Science∣武汉大学水稻研究团队发现水稻壁相关激酶OsWAKg16和OsWAKg52同时调控水稻抗病性和产量

近日&#xff0c;农学领域国际期刊Rice Science在线发表了武汉大学杂交水稻全国重点实验室范峰峰博士题为“Identification and Characterization of WAKg Genes Involved in Rice Disease Resistance and Yield”的研究论文。该论文系统分析了水稻壁相关激酶中包含半乳糖醛酸结…...

Spark,所用几个网页地址

hadoop的三大组成&#xff1a; 1. HDFS&#xff1a;存储。文件上传&#xff0c;下载 2. MapReduce&#xff1a;计算。词频统计&#xff0c;流量统计 3. YARN&#xff1a;调度 History Server网址&#xff1a;192.168.56.100:18080HDFS的NameNode网址&#xff1a;http://hadoop1…...

K8S PV 与 PVC 快速开始、入门实战

假设有如下三个节点的 K8S 集群&#xff1a; ​ k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、什么是 PV 与 PVC 1.1、什么是 PV&#xff08;PersistentVolume 持久卷&#xff09; PV 是集群中由管理员配置的一段网络存储&#xf…...

5月6(信息差)

一、经济与贸易 中美关税谈判进展 美方近期多次主动向中方传递谈判信号,中方回应称“谈的大门始终敞开”,但强调美方需先取消单边加征关税等错误做法78。 美国第一季度GDP环比下降0.3%,为2022年第二季度以来新低,经济压力或推动其加快谈判进程78。 全球贸易政策变动 特朗普…...

购物|电商购物小程序|基于微信小程序的购物系统设计与实现(源码+数据库+文档)

电商购物小程序 目录 基于微信小程序的购物系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户前台功能实现 2、管理员后台功能实现 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文参考 七、最新计算机毕设选题…...

基于k8s的Jenkins CI/CD平台部署实践(三):集成ArgoCD实现持续部署

基于k8s的Jenkins CI/CD平台部署实践&#xff08;三&#xff09;&#xff1a;集成ArgoCD实现持续部署 文章目录 基于k8s的Jenkins CI/CD平台部署实践&#xff08;三&#xff09;&#xff1a;集成ArgoCD实现持续部署一、Argocd简介二、安装Helm三、Helm安装ArgoCD实战1. 添加Arg…...

Python实例题:高德API+Python解决租房问题

目录 Python实例题 题目 python-amap-rental结合高德 API 和 Python 解决租房问题的脚本 代码解释 get_geocode 函数&#xff1a; search_rentals 函数&#xff1a; 主程序&#xff1a; 运行思路 注意事项 Python实例题 题目 高德APIPython解决租房问题 python-ama…...

WIN10 系统增加MYSQL环境变量示例

说明&#xff1a; 由于安装MYSQL需要添加到环境变量后才能启动运行&#xff0c;这里记录一下添加mysql环境变量的过程。 1、进入我的电脑-属性 2、找到高级设置 3、找到环境变量 4、找到PATH 5、双击进入后通过新建添加对应MYSQL的安装路径&#xff08;.exe所在的bin路径&…...

NetApp SAS 连接线:铜缆与光缆的全面介绍

写在前面 NetApp 的磁盘扩展柜&#xff0c;主要是12GB的shelf&#xff0c;如DS212C,224C,460C等&#xff0c;这些shelf中间的互联或者控制器到shelf的连接都是通过12Gb的SAS线来连接的&#xff0c;以实现高速数据传输。SAS 连接线是这一过程中的核心组件。但是NetApp的SAS连接…...

CSS中的@import指令

一、什么是import指令&#xff1f; import 是CSS提供的一种引入外部样式表的方式&#xff0c;允许开发者在CSS文件中引入其他CSS文件&#xff0c;或者在HTML的<style>标签中引入外部样式。与常见的<link>标签相比&#xff0c;import 提供了一种更“CSS原生”的样式…...

tinyrenderer笔记(上)

tinyrenderer个人代码仓库&#xff1a;tinyrenderer个人练习代码参考笔记&#xff1a;从零构建光栅器&#xff0c;tinyrenderer笔记&#xff08;上&#xff09; - 知乎 第 1 课&#xff1a;Bresenham 画线算法 Bresenham 画线算法&#xff1a;Bresenham 直线算法 - 知乎 第一…...

VS2022 Qt配置Qxlsx

目录 1、下载QXlsx&#xff0c;并解压文件夹 ​编辑2、打开VS2022配置QXlsx 3、VS配置Qxslx库 方法一&#xff1a;常规方法 方法二&#xff1a;直接使用源码 方法三&#xff1a;将QXlsx添加到Qt安装目录&#xff08;暂时尝试未成功&#xff09; 1、下载QXlsx&#xff0c;…...

C++ 渗透 数据结构中的二叉搜索树

欢迎来到干货小仓库 "沙漠尽头必是绿洲。" --面对技术难题时&#xff0c;坚持终会看到希望。 1.二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一颗空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; a、若它的左子树不为空&#xff0c;则…...

JavaScript学习教程,从入门到精通,jQuery 单击页面显示自定义动画、元素删除操作、随机抽奖、随机选图并放大语法知识点(37)

jQuery 单击页面显示自定义动画、元素删除操作、随机抽奖、随机选图并放大语法知识点 1. jQuery 基础语法 1.1 引入 jQuery 在使用 jQuery 之前&#xff0c;需要先引入 jQuery 库。可以通过 CDN 引入&#xff0c;也可以下载到本地使用。 <!-- 通过 CDN 引入 jQuery -->…...

5.6 react组件化开发基础

react 组件开发基础 组件分类与组件使用 组件传参 父传子 【函数数据传值 实参 形参对应关系】 子传父 插槽 透传 useContext 上下文&#xff08;作用域&#xff09; 跨层级调用方法 通过子组件的实例对象useRef 直接调用子组件的方法 和数据 状态管理&#xff08;非常多…...

react-14defaultValue(仅在首次渲染时生效)和value(受 React 状态控制)

在 React 中&#xff0c;defaultChecked/checked 和 defaultValue/value 是用于处理表单元素初始值和受控值的属性对。区别在于表单元素是否受 React 组件状态控制。 1. defaultValue 作用&#xff1a;设置表单元素的初始值&#xff08;仅在首次渲染时生效&#xff09;。特点…...

HarmonyOS 5.0 低时延音视频开发​​

大家好&#xff0c;我是 V 哥。 在HarmonyOS 5.0的开发中&#xff0c;支持低时延音视频开发&#xff0c;为了确保语法正确&#xff0c; V 哥以下代码符合HarmonyOS NEXT API 14的规范。为了方便初学者更好入门&#xff0c;V 哥伙同2位小伙伴花了1年时间&#xff0c;搞了三本鸿蒙…...

视频智能分析网关助力小区/住宅/街道智慧社区管理服务全面升级

一、引言​ 随着信息技术的飞速发展&#xff0c;智慧社区建设已成为提升居民生活质量、优化社区管理的重要趋势。智能分析网关作为智慧社区的核心技术支撑之一&#xff0c;凭借其强大的数据处理和智能分析能力&#xff0c;在社区的安防监控、人员车辆管理、环境卫生检测等多个…...

ShardingJdbc-水平分表

ShardingJdbc-水平分表 水平分表 表结构相同表数据记录不同多张分表记录数和才是总的记录数通常根据主键ID进行分表&#xff0c;这里采用奇偶策略 案例 建立库 sharding-demo建立表 user_1、user_2 表结构相同id 为主键&#xff0c;bigint 类型分表规则 id 为偶数的记录存储…...

AI应用爆发或将进入临界点

在科技发展的长河中,总有一些时刻如惊雷般震撼世界,预示着新时代的到来。如今,AI应用似乎正站在这样一个关键节点上,一场前所未有的变革风暴或许即将席卷而来,AI应用的爆发或将进入临界点。 当我们回顾科技发展的历程,不难发现每一次重大的技术突破都曾引发社会的巨大变…...

Javase 基础加强 —— 05 Map集合

本系列为笔者学习Javase的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程&#xff0c;java零基础入门到大牛一套通关》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习Javase系列课程的同学们提供参考。 01 概述 Ma…...

LINUX——例行性工作

单一执行的例行性工作 仅处理一次的工作&#xff0c;可用于在特定时间执行工作 at命令的工作过程&#xff1a; at命令使用时的权限控制&#xff1a;通过两个文件/etc/at.allow和/etc/at.deny来控制哪些用户可以使用at命令。如果这两个文件都不存在&#xff0c;那么只有root用户…...

天线测试报告解读学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、无源测试和有源测试二、无源测试报告1.驻波2.回损3.史密斯圆图4.效率5.增益6.天线方向图7.天线隔离度8.无源测试总结 三、有源测试报告1.TRP与TIS2.测试指标…...

Kotlin Android开发过渡指南

为了帮助Java开发者顺利过渡到Kotlin进行Android开发,以下是一本指南的详细大纲设计,涵盖关键知识点、迁移策略和实践案例: 《Kotlin for Android开发:从Java到Kotlin的平滑过渡指南》大纲 第一部分:为什么选择Kotlin? Kotlin的优势 简洁性、安全性、与Java的互操作性Go…...

Hadoop架构再探讨

文章目录 1.Hadoop的优化与发展1.1Hadoop的局限与不足1.2针对Hadoop的改进与提升 2.HDFS2.0新特性2.1HDFS HA1.HDFS 1.0 组件及功能回顾​2. HDFS 1.0 的单点故障问题​3. HDFS HA&#xff08;高可用&#xff09;解决方案​ 2.2HDFS Federation1.HDFS1.0中存在的问题2.HDFS Fed…...

ffmpeg录音测试

ffmpeg ffmpeg 是一个强大的多媒体处理工具&#xff0c;可以用于录音、音频处理、视频录制等多种功能。以下是使用 ffmpeg 进行录音的详细指令和参数说明。 基本录音指令 以下是一个简单的 ffmpeg 录音命令&#xff0c;将音频录制为 WAV 格式文件&#xff1a; ffmpeg -f …...

Kotlin-解构声明

我们在使用对象时可能需要访问它们内部的一些属性: class Student(var name: String, var age: Int) fun main() {val student Student("小明", 18)println(student.name)println(student.age) }这样看起来不太优雅,我们可以像下面这样编写: class Student(var na…...

【MCP Node.js SDK 全栈进阶指南】专家篇(2):MCP多模型支持架构

引言 在实际应用中,单一模型往往难以满足所有业务需求,这就需要一种灵活的架构来支持多模型集成和智能调度。Model Context Protocol (MCP) 作为连接应用与AI模型的标准协议,为多模型支持提供了理想的基础架构。 本文作将深入探讨如何基于MCP构建多模型支持架构,包括多LL…...

使用阿里AI的API接口实现图片内容提取功能

参考链接地址&#xff1a;如何使用Qwen-VL模型_大模型服务平台百炼(Model Studio)-阿里云帮助中心 在windows下&#xff0c;使用python语言测试&#xff0c;版本&#xff1a;Python 3.8.9 一. 使用QVQ模型解决图片数学难题 import os import base64 import requests# base 64 …...