Kafka知识点总结
一、概述
¥1. 推拉模式
- pull(拉)模式:consumer采用从broker中主动拉取数据,不足之处是如果没有数据,消费者可能会陷入循环中,一直返回空数据。
- push(推)模式:由broker主动向消费者主动推送消息,缺点是由broker决定消息发送速率,很难适应所有消费者的消费速率
- Kafka采用 pull(拉)模式!
pull模式的优点:
- 控制消费速率:消费者可以根据自己的处理能力决定拉取数据的频率和数量,从而避免被过多的数据淹没。
- 简化系统复杂性:推模式需要复杂的流量控制机制来防止生产者发送数据过快导致消费者无法处理。而拉模式将这种控制交给消费者,简化了系统设计。
- 灵活性:消费者可以灵活地选择何时以及从哪个分区拉取数据,这使得 Kafka 能够支持多种消费模式,如实时处理、批量处理等
二、生产者
1. 线程模型
生产者在发送消息时主要存在两个线程:主线程 和 Sender线程
- 主线程即调用KafkaProducer.send方法的线程。当send方法被调用时,消息并没有真正被发送,而是暂存到RecordAccumulator。通过暂存机制可以提升吞吐量,可以将多条消息通过一个ProduceRequest批量发送出去,并提高数据压缩效率
- Sender线程在满足一定条件后,会去RecordAccumulator中取消息并发送到Kafka Server端。
2. 消息生产流程
- 当接受外部传过来的数据的时候,会先创建一个main线程,在main线程中创建producer对象,然后调用send方法,将数据进行发送
- 消息会经过拦截器,对发送的数据进行处理、加工,再经过序列化器,对传输的数据进行序列化
- 根据分区器的分区策略决定传输的数据发送至哪个分区
- 通过消息暂存器将数据写入暂存区
- 消息暂存器维护了一个内存池(默认大小32M),并且为每一个分区维护了一个双端队列,队列中是一个个批次
- 写入数据时,会从内存池中取出内存,创建批次(默认大小16k)
- 当缓存空间耗尽,其他发送调用将被阻塞当缓存空间耗尽,其他发送调用将被阻塞
- 当一个批次的数据大小积累到 batch.size 或者到达了延迟时间 linger.ms,唤醒sender线程
- Sender线程从分区中拉取数据。拉取数据的方式是以brokerId为key,所有分区的请求为value放到队列中
- Sender线程通过selector发送数据,数据发送成功之后,会有应答机制,返回acks,应答级别有3种。如果反馈回来的请求是成功,则会删除发送数据成功的请求以及清理分区中请求中拉取的数据(释放批次的内存,放回到内存池中)。如果失败会进行重试,重试的次数(默认是Int的最大值,可以进行修改,一般是3-5次)
- 如果发送数据的第一个请求到达集群中的某一个broker没有应答,允许继续发送请求,默认每个broker节点最多缓存5个请求
3. 分区选择策略
- 指明 partition 的情况下,直接将指明的值直接作为 partiton 值
- 既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition值,也就是常说的 round-robin 算法。
- 没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition数进行取余得到 partition 值;在Producer往Kafka插入数据时,控制同一Key分发到同一Partition
¥4. ACK级别
生产者数据发送成功之后,会有应答机制,返回acks,ack有三种级别:
- 0:生产者发送过来的数据,不需要等数据落盘就应答。有可能在落盘的过程中,leader服务器挂了,但是已经返回成功的信息,所以则会导致丢失数据。
- 1:生产者发送过来的数据,Leader收到数据后再去应答。有可能在应答完成之后,还没有开始同步副本数据,Leader挂了,然后会在剩余的follower中重新选择出一个Leader,但是新的Leader不会接受到之前发送的数据,因为之前的Leader已经返回发送成功的消息了,所以则会导致数据丢失。
- -1:生产者发送过来的数据,Leader和ISR队列中的所有节点都收齐数据之后才去应答。
数据重复问题:Leader和ISR队列里面的所有节点收齐数据后应答,接受完数据之后,在未进行应答反馈之前,leader挂掉,会在follower中重新选举leader,producer未接受到成功的反馈,所以会向leader再次发送数据,就造成了消息重复的问题。需要考虑幂等解决方案
三、消费者
1. 消息消费流程
- 消费者创建连接客户端(ConsumerNetworkClient),调用 sendFetches 方法向kafka集群发送消费请求
- Server收到请求后,向消费者按批次发送消息数据
- 消费者端将收到的消息按照批次大小放到一个队列中(completedFetches)
- 然后消费者会从队列(FetchedRecords)中抓取数据,Max.poll.records一次拉取数据返回消息的最大条数默认500条,然后经过反序列化、拦截器等进行数据处理,最终进行消费。
2. 消费者配置
- Fetch.min.bytes:每批次最小抓取大小(默认1字节), 当一批次数据不满足最小的抓取大小(1字节),等待到达超时时间,也会将这些数据返回。
- fetch.max.wait.ms:一批数据最小值未达到的超时时间(默认500ms)
- Fetch.max.bytes:每批次最大抓取大小(默认50m)
- Max.poll.records:一次拉取数据返回消息的最大条数(默认500条)
3. 分区分配策略
Kafka将一个Topic下的数据横向分成了多个"分区"(Partition),而每个分区内的数据只会被同一消费者组中的一个消费者消费。有以下几种分区分配策略:
- Range:通过partitions/consumer数来决定每个消费者应该消费几个分区,按顺序依次分配,如果除不尽则前面几个消费者多消费1个分区
再平衡策略:如果一个消费者挂了,那么分配给该消费者的分区会被整体分配到某个其他消费者
数据倾斜问题:如果有多个 topic都除不尽,那么针对每个 topic,消费者 C0都将多消费 1 个分区,topic越多,C0消费的分区会比其他消费者明显多消费 N 个分区。
- RoundRobin:先将所有分区按照字典序排序,然后通过轮询方式逐个将分区依次分配给每个消费者
再平衡策略:某个消费者挂掉之后,所有的分区会重新进行一次再分配(可能会造成资源的浪费)
- Sticky:分区分配尽可能均匀(冲突时该原则优先),分区分配尽可能与上次分配保持相同
再平衡策略:0 号消费者挂掉之后,0 号消费者的分区以轮询的方式尽可能均匀地分配到1号消费者或者 2 号消费者。而1号消费者或者 2 号消费者依旧保持原有的分区,即重分配后尽可能和上次分配保持相同,使分配策略具备一定“黏性”,从而减少系统资源的消耗和异常情况的发生
分区分配原理:全部消费者组被分为多个子集,每个消费者组子集在服务端都对应一个 GroupCoordinator 对其进行管理。而 GroupCoordinator 最重要的职责就是负责执行消费者再均衡的操作
如果多个消费者,彼此配置的分配策略并不完全相同:
- GroupCoordinator会收集各个消费者支持的所有分配策略,组成候选集candidates
- 每个消费者从候选集candidates中找出第一个自身支持的策略,为这个策略投上一票
- 选票数最多的策略即为当前消费者组的分配策略
¥4. 偏移量
kafka为分区中的每条消息保存一个偏移量(offset),这个偏移量是该分区中一条消息的唯一标示。也表示消费者在分区的位置。已提交的位置是已安全保存的最后偏移量,如果进程失败或重新启动时,消费者将恢复到这个偏移量。
偏移量的提交方式分为两种:
- 自动提交:消费者每间隔一段时间会自动提交消费的offset到系统主题中。(auto.commit.interval.ms:每隔多长时间自动提交一次,默认5s)。可能导致消息丢失,没有确认已经对消息作了处理,就标记为已消费
- 手动提交:可能导致重复消费,如果在插入数据库之后,手动提交之前失败
- commitSync(同步提交):必须等待offset提交完毕,再去消费下一批数据,如果失败则会发起重试
- commitAsync(异步提交):发送完提交offset请求后,就开始消费下一批数据了
5. 重置策略
auto.offset.reset参数决定了在消费者启动时如何处理未知的偏移量(offset)。具体来说,当消费者的组(consumer group)没有已提交的偏移量,或者消费者的偏移量超出了可用的日志范围时,auto.offset.reset 策略会决定从哪里开始读取消息。
- earliest:从最早的偏移量开始读取。确保消费者从头开始读取所有消息,适用于需要处理所有历史数据的场景。
- latest(默认):从最新的偏移量开始读取。确保消费者只读取新产生的消息,适用于只需要处理最新数据的场景。
- none:抛出异常
三、服务端
1. 消息存储结构
- Topic内部又划分成多个Partition,Partition所对应的一个或多个Replica,Replica由Log文件存储
- 为了防止Log过大,增加消息过期和数据检索的成本,Log又会按一定大小划分成"段",即LogSegment。
- 为了提升查询效率,还为Log生成了索引文件.index和.timeindex
¥2. 高性能IO
顺序I/O
- LogSegment创建时,一口气申请LogSegment最大size的磁盘空间,这样一个文件内部尽可能分布在一个连续的磁盘空间内
- .log文件也好,.index和.timeindex也罢,在设计上都是只追加写入,不做更新操作,这样避免了随机IO的场景
不同Partition在磁盘上的存储位置不保证连续,当以不同Partition为读写目标并发地向Kafka发送请求时,Server端近似于随机IO。因此不要创建太多的Partition
PageCache
Kafka重度依赖底层操作系统提供的PageCache功能。当上层有写操作时,操作系统只是将数据写入PageCache。当读操作发生时,先从PageCache中查找,如果找不到,再去磁盘中读取。
零拷贝
消费者非零拷贝流程:
- 从磁盘文件到linux内核页缓存(DMA拷贝)
- 从内核页缓存到kafka(cpu拷贝)
- 接着从kafka到内核的socket缓存(cpu拷贝)
- 从socket缓存到网卡(DMA拷贝)
CPU拷贝:需要在用户态和内核态之间来回切换,会消耗大量的资源和时间。
DMA拷贝:DMA是一种硬件技术,允许外设(如网卡)直接访问内存,绕过CPU的参与,从而实现高速数据传输。
零拷贝:broker应用层不操作数据,所以不需要将数据拷贝到broker应用层,可以直接由页面缓存通过网卡将数据发送到消费者。
四、高可用
1. 副本
副本是针对分区而言的,即副本是分区的副本。一个分区有一个 leader 副本,多个 follower 副本,只有 leader副本对外提供服务,follower 副本只负责数据同步
分区所有副本统称 AR,ISR 指与 leader副本保持同步状态的副本集合。相关参数:
- replication.factor:指定了一个分区(partition)的副本数量
- min.insync.replicas:指定了一个分区的最小同步副本数(in-sync replicas, ISR)。ISR 是指那些与领导者节点保持同步的副本集合。等到所有 ISR 集合中的副本都确认收到后才能被认为已提交,在副本稳定的情况下,不会出现数据不一致的情况
2.CAP模型
通过不同配置实现不同的CAP模型
- CP模型:replication.factor = 3,min.insync.replicas = 3,acks = all
- AP模型:replication.factor = 3,min.insync.replicas = 3,acks = 1。对于任意写入一条数据,当主节点commmit了之后就返回ack;如果主节点在数据被replicate到从节点之前就宕机,这时,重新选举之后,消费端就读不到这条数据。
- 兼顾:replication.factor = 3,min.insync.replicas = 2,acks = all。可以容忍一个节点宕机,同时也可以容忍这个节点和其它节点产生网络分区,它们都可以看成是Kafka的容错(Fault tolerance)机制
3. 宕机恢复
leader epoch 代表 leader 的纪元信息,初始值为0,每当 leader 变更一次, leader epoch 的值就会加1。 当某一节点从宕机状态恢复时,会去查找该节点当前 leader epoch 的 LEO 作为截断依据。
四、消息队列常见问题
1. 线程安全问题
生产者是线程安全的,在线程之间共享单个生产者实例,通常单例比多个实例要快。
消费者是非线程安全的,KafkaConsumer的每个公用方法在执行操作前都会调用 acquire() 方法,该方法用来检测当前是否只有一个线程在操作(CAS),若有其他线程正在操作则会抛出 ConcurrentModifcationException 异常
解决方案:
- 线程封闭:为每个线程实例化一个 KafkaConsumer对象
- Reactor 模型:消费者线程专门用来接收消息,接收到消息后采用多线程的方式(线程池)来处理消息
¥2. 如何保证消息有序性
原理:
- 写入同一个partion分区中的数据是一定有顺序的
- kafka中一个消费者消费一个partion的数据,消费者取出数据时,也是有顺序的
实现:
- 在生产者端,应保证消息被写入同一分区。可以在构造消息时指定消息的key或指定分区。并且设置参数max.in.flight.requests.per.connection=1,也即同一个链接只能发送一条消息,如此便可严格保证Kafka消息的顺序
- max.in.flight.requests.per.connection 是 Kafka 生产者配置中的一个重要参数,它控制了在等待确认(acks)之前可以发送的最多请求数量。当 acks 设置为 all 或 -1 时,或生产者配置了重试机制(retries > 0),如果 max.in.flight.requests.per.connection 设置为大于 1 的值,可能会导致消息乱序。
- 设置enable.idempotence=true,开启生产者的幂等生产,允许max.in.flight.requests.per.connection>1提升吞吐量。如果消息序号比Broker维护的序号差值比一大,说明中间有数据尚未写入,即乱序,此时Broker拒绝该消息
- 在消费者端,需要被顺序处理的消息让同一线程顺序处理。可以在消费者中,消息分发至不同的线程时,加一个队列,消费者去做hash分发,将需要顺序处理的数据分发至同一个队列中,最后多个线程从各自的队列中取数据
- 在进行分区扩容时,发送至同一个partion分区的方案可能会有问题。可以在消息中指明消息顺序,在消费者的代码逻辑中处理顺序
¥3. 如何保证消息可靠性
- 在生产者端需确保生产者生产的消息被接收,acks 设置为-1,通过重试机制来确保消息写入Kafka
- 在消费者端需确保消费者正确的消费消息,应手动提交偏移量
- 在Broker端需保证数据高可用,区副本大于等于 2 (–replication-factor 2),ISR 里应答的最小副本数量大于等于 2(min.insync.replicas = 2)
¥4. 如何保证消息消费幂等性
- 生产者幂等性:enable.idempotence参数,可保证单个生产者会话(session)中单分区的消息幂等
原理:
- 每个新的生产者实例在初始化时会被分配一个PID(producer id)
- 对于每个PID,消息发送到的每一个分区都有对应的序列号,序列号从0开始单调递增,生产者每发送一条消息就会将<PID,分区>对应的序列号值加1
- broker端会在内存中为每一对<PID,分区>维护一个序列号,对于收到的每一条消息,只有当它的序列号的值(SN_new)正好比broker端中维护的对应序列号的值(SN_old)大1,broker才会接收该消息。如果 SN_new < SN_old + 1,说明消息被重复写入,broker会将该消息丢弃。否则,说明中间有数据尚未写入,暗示可能有消息丢失,对应生产者会抛出 OutOfOrderSequenceException 异常
- 消费者幂等性:
- 唯一Id:在数据库中发现某个id的消息已被消费过,则放弃消费
- 数据库乐观锁:生产消息时先查询版本号,并将版本号连同消息一起发给消息队列;消费端收到消息和版本号后,在执行SQL时带上版本号
- 事务处理:消息的消费和入库操作在一个事务中
5. 事务消息
- 原子性:确保一组消息在多个分区和主题之间保持原子性。这意味着如果事务提交成功,所有消息都会被写入;如果事务失败,所有消息都不会被写入。
- 幂等性:重复发送相同的消息不会导致重复处理,包括多分区。这通过 idempotent 生产者实现,确保每个消息只被处理一次。
- 隔离性:提供了类似于数据库的事务隔离级别,确保在事务进行期间,其他消费者看不到未提交的消息。通过设置消费端的参数 isolation.level 确定,默认值为 read_uncommitted
6. 消息积压问题
- kafka消费能力不足:同时提升分区数量和消费者组的消费者数量,保持 消费者数 = 分区数量
- 下游消息处理不及时:
- 如果没有充分利用下游消费者的处理能力,可以提高每批次拉取的消息数量,如默认一次拉取500条可以修改为1000条;也可以一次多拉一点,调整 fetch.max.bytes 大小,默认是 50m
- 优化消费者的处理逻辑,检查消费者的代码是否存在性能瓶颈或是复杂的处理逻辑
- 扩展硬件资源
- 下游接口阻塞,无法成功消费:先将堆积的消息存储到数据库,待接口恢复正常后,再将消息推送到MQ
相关文章:
Kafka知识点总结
一、概述 ¥1. 推拉模式 pull(拉)模式:consumer采用从broker中主动拉取数据,不足之处是如果没有数据,消费者可能会陷入循环中,一直返回空数据。push(推)模式:…...
[AI]从零开始的llama.cpp部署与DeepSeek格式转换、量化、运行教程
一、前言 在上一次的DeepSeek的部署教程中,我们使用Ollama与LM Studio很轻松的部署了DeepSeek并且也完成了相关API的调用,如果还有不会的小伙伴请看下面的教程: DeepSeek本地部署:[AI]从零开始的DeepSeek本地部署及本地API调用教…...
#define宏与编译时定义的本质对决:从const常量到typedef的类型安全演进
目录 一、#define宏与const常量的本质差异:从文本替换到类型安全的编程抉择 1. 预处理阶段的文本替换(#define) 2. 编译时的类型安全(const) 3. 跨文件访问的限制 4. 代码示例对比 5. 最佳实践 总结表 二、类型…...
【天地图】绘制、删除点线面
使用天地图绘制、删除点线面 实现效果图地图组件完整代码使用地图组件完整代码 实现效果图 地图组件完整代码 // 天地图组件 <template><div class"map-container"><div id"mapCon"></div></div> </template><scri…...
2025年:边缘计算崛起下运维应对新架构挑战
一、引言 随着科技的飞速发展,2025年边缘计算正以前所未有的速度崛起,给运维行业带来了全新的架构挑战。在这个充满机遇与挑战的时代,美信时代公司的美信监控易运维管理软件成为运维领域应对这些挑战的有力武器。 二、边缘计算崛起带来的运维…...
【docker知识】快速找出服务器中占用内存较高的容器
本文由Markdown语法编辑器编辑完成。 1.背景: 近期在处理现场问题,观察服务器时,会遇到某些进程占用较高内存的情况。由于我们的服务,基本上都是以容器的方式在运行,因此就需要找到,到底是哪个容器&#…...
SQL联合查询
文章目录 MySQL系列:1.内连接2.外连接3.自连接4.子查询5.合并查询6.插入查询 MySQL系列: 初识MySQL,MySQL常用数据类型和表的操作,增删改查(CRUD)操作(总),数据库约束数据库设计 #班级表 drop table if exists class; create ta…...
cameralib 安装
目录 linux安装: 测试安装是否成功: linux安装: pip install githttps://github.com/isarandi/cameralib.git pip install githttps://github.com/isarandi/boxlib.git pip install githttps://github.com/isarandi/poseviz.git githttps…...
Windows软件自动化利器:pywinauto python
Pywinauto WindowsAPP UI自动化 Windows软件自动化利器:pywinauto python...
清华大学《DeepSeek:从入门到精通》
近日,清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室发布了由余梦珑博士后及其团队撰写的《DeepSeek:从入门到精通》手册。这份长达104页的指南,旨在帮助用户全面掌握国产通用人工智能平台DeepSeek的核心功能与应用技巧。 DeepSeek简…...
网易易盾接入DeepSeek,数字内容安全“智”理能力全面升级
今年农历新年期间,全球AI领域再度掀起了一波革命性浪潮,国产通用大模型DeepSeek凭借其强大的多场景理解与内容生成能力迅速“出圈”,彻底改写全球人工智能产业的格局。 作为国内领先的数字内容风控服务商,网易易盾一直致力于探索…...
天童美语:观察你的生活
在孩子的认知里,世界宛如一片充满神秘色彩的未知之境,有着无尽的奥秘等待他们去探索。家长们,引导孩子用心观察世界,领略其中的美妙,这对孩子的成长进程有着极为关键的作用。贵阳天童教育相信:观察生活&…...
易仓科技ai面试
请解释PHP中的面向对象编程的基本概念,并举例说明如何在PHP中定义一个类。 回答思路:需理解类、对象、继承和多态等基本概念,并能通过实例代码展示如何定义类及其属性和方法。 . 类(Class) 类是一个封装了数据和操作…...
MySQL-SQL
1.客户端内置命令 客户端内置命令客户端独有,可能不同数据库产品的客户端内置命令存在很大差异,不像SQL命令有标准规范。 help \h ? \? 这四个命令都可以输出帮助文档查看客户端内置命令 ?(\?)“帮助”…...
基础连接已经关闭: 服务器关闭了本应保持活动状态的连接
您在进行 HTTP 请求时遇到“基础连接已经关闭: 服务器关闭了本应保持活动状态的连接”的错误,这通常与连接的保持活动(Keep-Alive)设置有关。以下是可能的原因和解决方法: 可能的原因: Keep-Alive 设置: 默…...
【React组件通讯双重视角】函数式 vs 类式开发指南
目录 前言 正文 父组件向子组件传值 函数式写法 类式写法 子组件向父组件传值 函数式写法 类式写法 兄弟组件通信 函数式写法 类式写法 跨层级通信(使用Context) 函数式写法 类式写法 进阶通讯方式(补充说明…...
开源项目Perplexica-master
一个和https://www.perplexity.ai/差不多的开源项目 大模型的key可以用groq的,免费(https://console.groq.com/keys),有速率限制 项目clone后,修改配置,项目根目录config.toml 填写对应的大模型的key就行…...
数值积分:通过复合梯形法计算
在物理学和工程学中,很多问题都可以通过数值积分来求解,特别是当我们无法得到解析解时。数值积分是通过计算积分区间内离散点的函数值来近似积分的结果。在这篇博客中,我将讨论如何使用 复合梯形法 来进行数值积分,并以一个简单的…...
DeepSeek全生态接入指南:官方通道+三大云平台
DeepSeek全生态接入指南:官方通道三大云平台 一、官方资源入口 1.1 核心交互平台 🖥️ DeepSeek官网: https://chat.deepseek.com/ (体验最新对话模型能力) 二、客户端工具 OllamaChatboxCherry StudioAnythingLLM …...
shell脚本的一些学习笔记----(三)流程控制
1.条件判断 if单条件判断 if [ 条件判断式 ] then 语句块 fi 案例1:统计根分区使用率 [rootlocalhost ~]$ vi sh/if1.sh #!/bin/bash #把根分区使用率作为变量值赋予变量rate rate$(df -h | grep "/dev/sda1" | awk {print $5}’| cut -d "%"-f…...
Docker Desktop WebAPI《1》
方法1 》》生成 的文档不要动, 》》执行 Container(Dockerfile) 会生成镜像文件和容器 》》生成的镜像和容器 在 Docker Desktop 中可以查看 用VS 的 Container Dockerfile 调试 但把这个调试工工具 停止,WebAPi就不能访问了 …...
Linux驱动层学习:LED 驱动开发
前置知识: 1、地址映射 MMU 全称叫做 Memory Manage Unit,也就是内存管理单元。 MMU 主要完成的功能如下: ①、完成虚拟空间到物理空间的映射。 ②、内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性。 第…...
全面解析鸿蒙(HarmonyOS)开发:从入门到实战,构建万物互联新时代
文章目录 引言 一、鸿蒙操作系统概述二、鸿蒙开发环境搭建三、鸿蒙核心开发技术1. **ArkUI框架**2. **分布式能力开发**3. **原子化服务与元服务** 四、实战案例:构建分布式音乐播放器五、鸿蒙开发工具与调试技巧六、鸿蒙生态与未来展望结语 引言 随着万物互联时代…...
zyNo.23
SQL注入漏洞 1.SQL语句基础知识 一个数据库由多个表空间组成,sql注入关系到关系型数据库,常见的关系型数据库有MySQL,Postgres,SQLServer,Oracle等 以Mysql为例,输入 mysql-u用户名-p密码 即可登录到MySQL交互式命令行界面。 既然是…...
调用DeepSeek API接口:实现智能数据挖掘与分析
在当今数据驱动的时代,企业和开发者越来越依赖高效的数据挖掘与分析工具来获取有价值的洞察。DeepSeek作为一款先进的智能数据挖掘平台,提供了强大的API接口,帮助用户轻松集成其功能到自己的应用中。本文将详细介绍如何调用DeepSeek API接口&…...
【Linux】Ubuntu Linux 系统——Node.js 开发环境
ℹ️大家好,我是练小杰,今天星期五了,同时也是2025年的情人节,今晚又是一个人的举个爪子!! 🙂 本文是有关Linux 操作系统中 Node.js 开发环境基础知识,后续我将添加更多相关知识噢&a…...
Redis7——基础篇(一)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一) 一、Redis定义 官网地址:Redis - The Real-time Data Platform R…...
MySQL查看存储过程和存储函数
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…...
js实现点击音频实现播放功能
目录 1. HTML 部分:音频播放控件 2. CSS 部分:样式设置 3. JavaScript 部分:音频控制 播放和暂停音频: 倒计时更新: 播放结束后自动暂停: 4. 总结: 完整代码: 今天通过 HTML…...
Ubuntu安装docker:docker-desktop : 依赖: docker-ce-cli 但无法安装它、无法定位软件包 docker-ce-cli
具体错误 sudo apt-get install ./docker-desktop-amd64.deb [sudo] password for weiyu: 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 注意,选中 docker-desktop 而非 ./docker-desktop-amd64.de…...
免费deepseek的API获取教程及将API接入word或WPS中
免费deepseek的API获取教程: 1 https://cloud.siliconflow.cn/中注册时填写邀请码:GAejkK6X即可获取2000 万 Tokens; 2 按照图中步骤进行操作 将API接入word或WPS中 1 打开一个word,文件-选项-自定义功能区-勾选开发工具-左侧的信任中心-信任中心设置…...
华为交换机堆叠配置
华为交换机堆叠(Stack)技术是一种将多台物理交换机虚拟化为单一逻辑设备的高可靠性解决方案,可简化网络管理、提升带宽利用率并增强冗余能力。 一、堆叠的核心概念 堆叠系统组成:主交换机(Master)…...
基于Java SpringBoot以及vue前后端分离的旅游景区网站系统设计与实现
基于Java SpringBoot以及vue前后端分离的旅游景区网站系统设计与实现 本项目是一款基于Spring Boot和Vue.js开发的旅游景区管理系统,前端合后端的架构,支持用户在线浏览景区信息、预订门票,并提供完善的后台管理功能,包括订单管理…...
DeepSeek教unity------MessagePack-04
Union 联合 MessagePack for C# 支持序列化接口类型和抽象类类型的对象。它的行为类似于 XmlInclude 或 ProtoInclude。在 MessagePack for C# 中,这些被称为Union。只有接口和抽象类可以被 Union 属性注解。需要唯一的联合键。 /******************************…...
侯捷 C++ 课程学习笔记:C++ 新标准 11/14 的革新与实战应用
在侯捷老师的 C 系列课程中,《C 新标准 11/14》这门课程让我对现代 C 编程有了全新的认识。C11 和 C14 是 C 语言发展史上的重要里程碑,它们引入了大量新特性,极大地提升了语言的表达能力和开发效率。侯捷老师通过深入浅出的讲解和丰富的实战…...
MATLAB图像处理:Sobel、Roberts、Canny等边缘检测算子
边缘是图像中像素值剧烈变化的区域,反映了目标的轮廓、纹理等关键信息。边缘检测是图像分割、目标识别等任务的基础。本文将系统解析 六种经典边缘检测算子 的数学原理、实现方法及适用场景,并给出完整的MATLAB代码示例和对比分析。 1. 边缘检测基础 1…...
Python Pandas(7):Pandas 数据清洗
数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要使数据分析更加准确,就需要对这些没有用的数据进行处理。数据清洗与预处理的常见步骤: 缺失值处理:识别并…...
基于javaweb的SpringBootoa办公自动化系统设计和实现(源码+文档+部署讲解)
🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 运行环境开发工具适用功能说明部分代码展示 运行环境 Java≥8、MySQL≥5.7 开发工具 eclipse/idea/myeclipse/sts等均可配置运行…...
算法08-递归调用转为循环的通用方法
前导:问题引入 在Python中,递归调用过多会导致“递归深度过深”的错误,通常是因为递归没有正确终止条件或者递归层次太深。 这种错误通常会导致程序抛出 RecursionError 异常。 Python默认的递归深度限制大约是1000层(可以通过sys.getrecursionlimit()查看)。 修正方式…...
[qt5学习笔记]用vs2022(msvc2017)+copilot进行QtWidgetsApplication源码解析
一直没深入了解qt,又一段时间没写qt,重新捡起来。 开发环境 本地vs2022(msvc2017, v14.30)先升级到最新版本,方便使用copilot。 参考 VS2022QT5环境搭建 下载 qt5.14.2 用vs的qt插件设置qt5.14.2x86路径,x64版本未安装。 创建一…...
Nginx--日志(介绍、配置、日志轮转)
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、Nginx日志介绍 nginx 有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的…...
Transformer 模型介绍(一)——综述
Transformer 是一种完全基于注意力机制的神经网络模型,首次在2017年的论文《Attention Is All You Need》中提出。该模型最初用于机器翻译任务,并在特定任务中表现优于谷歌的其他神经网络机器翻译模型。Transformer 也是 Seq2Seq(序列到序列&…...
Ceph集群搭建2025(squid版)
squid版本维护年限 apt install -y cephadmecho >> "deb http://mirrors.163.com/ceph/debian-squid/ bookworm main" echo >> "deb-src http://mirrors.163.com/ceph/debian-squid/ bookworm main"#安装源 cephadm install #开始初始化一个最…...
封装neo4j的持久层和服务层
目录 持久层 mp 模仿: 1.抽取出通用的接口类 2.创建自定义的repository接口 服务层 mp 模仿: 1.抽取出一个IService通用服务类 2.创建ServiceImpl类实现IService接口 3.自定义的服务接口 4.创建自定义的服务类 工厂模式 为什么可以使用工厂…...
HTML 简介
1.什么是 HTML? 超文本:暂且简单理解为 “超级的文本”,和普通文本比,内容更丰富。 标 记:文本要变成超文本,就需要用到各种标记符号。 语 言:每一个标记的写法、读音、使用规则,…...
【AWS】EC2 安全组设置
在使用 Amazon Web Services (AWS) 的 EC2 实例时,很多用户会遇到关于 安全组 设置的问题,尤其是在创建或修改安全组时输入描述信息时。最近,有一个常见的错误是当用户在 EC2 安全组 配置中添加描述时,使用了中文字符,…...
git bisect 使用二分法查找引入错误的提交
git bisect 使用二分法查找引入错误的提交 Git bisect 命令官方文档 git bisect 这个命令使用二分搜索算法来查找项目历史中哪个提交引入了一个错误 使用该命令时,首先告诉它一个已知包含错误的 “坏” 提交 以及一个已知在错误出现之前的 “好” 提交 然后 git b…...
STM32 Flash详解教程文章
目录 Flash基本概念理解 Flash编程接口FPEC Flash擦除/写入流程图 Flash选项字节基本概念理解 Flash电子签名 函数读取地址下存放的数据 Flash的数据处理限制部分 编写不易,请勿搬运,感谢理解!!! Flash基本概念…...
业务开发 | 基础知识 | Maven 快速入门
Maven 快速入门 1.Maven 全面概述 Apache Maven 是一种软件项目管理和理解工具。基于项目对象模型的概念(POM),Maven 可以从中央信息中管理项目的构建,报告和文档。 2.Maven 基本功能 因此实际上 Maven 的基本功能就是作为 Ja…...
Python实现从SMS-Activate平台,自动获取手机号和验证码(进阶版2.0)
前言 本文是该专栏的第52篇,后面会持续分享python的各种干货知识,值得关注。 在本专栏之前,笔者在文章《Python实现SMS-Activate接口调用,获取手机号和验证码》中,有详细介绍基于SMS-Activate平台,通过python来实现自动获取目标国家的手机号以及对应的手机号验证码。 而…...