分布式消息队列Kafka(三)- 服务节点Broker

news2024/11/25 12:57:18

1.Kafka Broker 工作流程

(1)zookeeper中存储的kafka信息

​ 1)启动 Zookeeper 客户端。

[zrclass@hadoop102 zookeeper-3.5.7]$ bin/zkCli.sh 

​ 2)通过 ls 命令可以查看 kafka 相关信息。

[zk: localhost:2181(CONNECTED) 2] ls /kafka

在这里插入图片描述

(2)Kafka中两种Leader的概念

kafka集群中有2个种leader,一种是broker的leader即controller leader,还有一种就是partition中的副本的leader

1)Controller leader

当broker启动的时候,都会创建KafkaController对象,但是集群中只能有一个leader对外提供服务,这些每个节点上的KafkaController会在指定的zookeeper路径下创建临时节点,只有第一个成功创建的节点KafkaController才可以成为leader,其余的都是follower。当leader故障后,所有的follower会收到通知,再次竞争在该路径下创建节点从而选举新的leader

2) Replication leader

为了实现高可用,保证集群中的某个节点发生故障时,且节点上的partition 数据不丢失且kafka能正常提供服务,kafka提供副本机制,topic内的每个分区可以设置若干个副本(包含leader和follower); 消息的读写只会发生在leader副本上。

(3)Kafka Broker 总体工作流程

在这里插入图片描述

(4)模拟 Kafka 上下线,Zookeeper中数据变化

1)查看/kafka/brokers/ids 路径上的节点。

[zk: localhost:2181(CONNECTED) 2] ls /kafka/brokers/ids 

[0, 1, 2] 

2)查看/kafka/controller 路径上的数据。

[zk: localhost:2181(CONNECTED) 15] get /kafka/controller 

{"version":1,"brokerid":0,"timestamp":"1637292471777"} 

3)查看/kafka/brokers/topics/first/partitions/0/state 路径上的数据。

[zk: localhost:2181(CONNECTED) 16] get /kafka/brokers/topics/first/partitions/0/state 

{"controller_epoch":24,"leader":0,"version":1,"leader_epoch":18," isr":[0,1,2]} 

4)停止 hadoop104 上的 kafka。

[atguigu@hadoop104 kafka]$ bin/kafka-server-stop.sh 

5)再次查看/kafka/brokers/ids 路径上的节点。

[zk: localhost:2181(CONNECTED) 3] ls /kafka/brokers/ids 

[0, 1] 

6)再次查看/kafka/controller 路径上的数据。

[zk: localhost:2181(CONNECTED) 15] get /kafka/controller 

{"version":1,"brokerid":0,"timestamp":"1637292471777"} 

7)再次查看/kafka/brokers/topics/first/partitions/0/state 路径上的数据。

[zk: localhost:2181(CONNECTED) 16] get /kafka/brokers/topics/first/partitions/0/state 

{"controller_epoch":24,"leader":0,"version":1,"leader_epoch":18," isr":[0,1]} 

(5)Broker重要参数

在这里插入图片描述

在这里插入图片描述

2.kafka副本

(1)Kafka 副本作用:提高数据可靠性。

(2)Kafka 默认副本 1 个,生产环境一般配置为 2 个,保证数据可靠性;太多副本会 增加磁盘存储空间,增加网络上数据传输,降低效率。

(3)Kafka 中副本分为:Leader 和 Follower。Kafka 生产者只会把数据发往 Leader, 然后 Follower 找 Leader 进行同步数据。

(4)Kafka 分区中的所有副本统称为 AR(Assigned Repllicas)。

AR = ISR + OSR

ISR, In-Sync Replicas (同步副本集 ),表示和 Leader 保持同步的 Follower 集合。如果 Follower 长时间未向 Leader 发送通信请求或同步数据,则该 Follower 将被踢出 ISR。该时间阈值由 replica.lag.time.max.ms 参数设定,默认 30s。Leader 发生故障之后,就会从 ISR 中选举新的 Leader。

OSR, ( Out-Sync Relipcas ),表示 Follower 与 Leader 副本同步时,延迟过多的副本。

3.kafka分区副本的选举流程

(1)Kafka选举流程

Kafka 集群中有一个 broker 的 Controller 会被选举为 Controller Leader,负责管理集群 broker 的上下线,所有 topic 的分区副本分配和副本 Leader 选举等工作。 Controller 的信息同步工作是依赖于 Zookeeper 的。

在这里插入图片描述

(2)模拟kafka的Follewer和Leader故障

1)创建一个新的 topic,4 个分区,4 个副本

[zrclass@hadoop102 kafka]$ bin/kafka-topics.sh --bootstrap-server 
hadoop102:9092 --create --topic test --partitions 4 --replication-factor 4
Created topic test. 

2)查看 Leader 分布情况

[zrclass@hadoop102 kafka]$ bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic test
Topic: test TopicId: awpgX_7WR-OX3Vl6HE8sVg PartitionCount: 4 ReplicationFactor: 4
Configs: segment.bytes=1073741824
Topic: test Partition: 0 Leader: 3 Replicas: 3,0,2,1 Isr: 3,0,2,1
Topic: test Partition: 1 Leader: 1 Replicas: 1,2,3,0 Isr: 1,2,3,0
Topic: test Partition: 2 Leader: 0 Replicas: 0,3,1,2 Isr: 0,3,1,2
Topic: test Partition: 3 Leader: 2 Replicas: 2,1,0,3 Isr: 2,1,0,3

3)停止掉 hadoop105 的 kafka 进程,并查看 Leader 分区情况

如果 Follower 长时间未向 Leader 发送通信请求或同步数据,则该 Follower 将被踢出 ISR

[zrclass@hadoop105 kafka]$ bin/kafka-server-stop.sh
[zrclass@hadoop102 kafka]$ bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic test
Topic: test TopicId: awpgX_7WR-OX3Vl6HE8sVg PartitionCount: 4 ReplicationFactor: 4
Configs: segment.bytes=1073741824
Topic: test Partition: 0 Leader: 0 Replicas: 3,0,2,1 Isr: 0,2,1
Topic: test Partition: 1 Leader: 1 Replicas: 1,2,3,0 Isr: 1,2,0
Topic: test Partition: 2 Leader: 0 Replicas: 0,3,1,2 Isr: 0,1,2
Topic: test Partition: 3 Leader: 2 Replicas: 2,1,0,3 Isr: 2,1,0

4)停止掉 hadoop104 的 kafka 进程,并查看 Leader 分区情况

如果 Follower 长时间未向 Leader 发送通信请求或同步数据,则该 Follower 将被踢出 ISR

[zrclass@hadoop104 kafka]$ bin/kafka-server-stop.sh
[zrclass@hadoop102 kafka]$ bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic test
Topic: test TopicId: awpgX_7WR-OX3Vl6HE8sVg PartitionCount: 4 ReplicationFactor: 4
Configs: segment.bytes=1073741824
Topic: test Partition: 0 Leader: 0 Replicas: 3,0,2,1 Isr: 0,1
Topic: test Partition: 1 Leader: 1 Replicas: 1,2,3,0 Isr: 1,0
Topic: test Partition: 2 Leader: 0 Replicas: 0,3,1,2 Isr: 0,1
Topic: test Partition: 3 Leader: 1 Replicas: 2,1,0,3 Isr: 1,0

5)启动 hadoop105 的 kafka 进程,并查看 Leader 分区情况

Follower重新向leader发送通信请求或同步数据,Follower重新加入到ISR

[zrclass@hadoop105 kafka]$ bin/kafka-server-start.sh -daemon config/server.properties
[zrclass@hadoop102 kafka]$ bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic test
Topic: test TopicId: awpgX_7WR-OX3Vl6HE8sVg PartitionCount: 4 ReplicationFactor: 4
Configs: segment.bytes=1073741824
Topic: test Partition: 0 Leader: 0 Replicas: 3,0,2,1 Isr: 0,1,3
Topic: test Partition: 1 Leader: 1 Replicas: 1,2,3,0 Isr: 1,0,3
Topic: test Partition: 2 Leader: 0 Replicas: 0,3,1,2 Isr: 0,1,3
Topic: test Partition: 3 Leader: 1 Replicas: 2,1,0,3 Isr: 1,0,3

6)启动 hadoop104 的 kafka 进程,并查看 Leader 分区情况

Follower重新向leader发送通信请求或同步数据,Follower重新加入到ISR

[zrclass@hadoop104 kafka]$ bin/kafka-server-start.sh -daemon config/server.properties
[zrclass@hadoop102 kafka]$ bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic test
Topic: test TopicId: awpgX_7WR-OX3Vl6HE8sVg PartitionCount: 4 ReplicationFactor: 4
Configs: segment.bytes=1073741824
Topic: test Partition: 0 Leader: 0 Replicas: 3,0,2,1 Isr: 0,1,3,2
Topic: test Partition: 1 Leader: 1 Replicas: 1,2,3,0 Isr: 1,0,3,2
Topic: test Partition: 2 Leader: 0 Replicas: 0,3,1,2 Isr: 0,1,3,2
Topic: test Partition: 3 Leader: 1 Replicas: 2,1,0,3 Isr: 1,0,3,2

7)停止掉 hadoop103 的 kafka 进程,并查看 Leader 分区情况

Leader 发生故障之后,就会从 ISR 中选举新的 Leader,按照AR(分区中所有副本)的排列顺序轮询,即控制台中Replicas所展示的顺序轮询

[zrclass@hadoop103 kafka]$ bin/kafka-server-stop.sh
[zrclass@hadoop102 kafka]$ bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic test
Topic: test TopicId: awpgX_7WR-OX3Vl6HE8sVg PartitionCount: 4 ReplicationFactor: 4
Configs: segment.bytes=1073741824
Topic: test Partition: 0 Leader: 0 Replicas: 3,0,2,1 Isr: 0,3,2
Topic: test Partition: 1 Leader: 2 Replicas: 1,2,3,0 Isr: 0,3,2
Topic: test Partition: 2 Leader: 0 Replicas: 0,3,1,2 Isr: 0,3,2
Topic: test Partition: 3 Leader: 2 Replicas: 2,1,0,3 Isr: 0,3,2

(3)Leader Follower 故障处理细节

1)Follower故障处理细节

在这里插入图片描述

2)Leader故障处理细节

在这里插入图片描述

(4)kafka分区副本的分配

如果 kafka 服务器只有 4 个节点,那么设置 kafka 的分区数大于服务器台数,在 kafka
底层如何分配存储副本呢?
1)创建 16 分区,3 个副本
创建一个新的 topic,名称为 second。

[zrclass@hadoop102 kafka]$ bin/kafka-topics.sh --bootstrap-server 
hadoop102:9092 --create --partitions 16 --replication-factor 3 --topic second

查看分区和副本情况。

[zrclass@hadoop102 kafka]$ bin/kafka-topics.sh --bootstrap-server 
hadoop102:9092 --describe --topic second
Topic: second4 Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Topic: second4 Partition: 1 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
Topic: second4 Partition: 2 Leader: 2 Replicas: 2,3,0 Isr: 2,3,0
Topic: second4 Partition: 3 Leader: 3 Replicas: 3,0,1 Isr: 3,0,1
Topic: second4 Partition: 4 Leader: 0 Replicas: 0,2,3 Isr: 0,2,3
Topic: second4 Partition: 5 Leader: 1 Replicas: 1,3,0 Isr: 1,3,0
Topic: second4 Partition: 6 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
Topic: second4 Partition: 7 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2
Topic: second4 Partition: 8 Leader: 0 Replicas: 0,3,1 Isr: 0,3,1
Topic: second4 Partition: 9 Leader: 1 Replicas: 1,0,2 Isr: 1,0,2
Topic: second4 Partition: 10 Leader: 2 Replicas: 2,1,3 Isr: 2,1,3
Topic: second4 Partition: 11 Leader: 3 Replicas: 3,2,0 Isr: 3,2,0
Topic: second4 Partition: 12 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Topic: second4 Partition: 13 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
Topic: second4 Partition: 14 Leader: 2 Replicas: 2,3,0 Isr: 2,3,0
Topic: second4 Partition: 15 Leader: 3 Replicas: 3,0,1 Isr: 3,0,1

总结

1.kafka的副本数量不能大于broker节点数量。kafka的副本数量和HDFS的副本数量是有区别的。
  (1)HDFS的副本数量表示为最大副本数量,当DataNode节点数量小于设置的副本数量时没有任何问题,当新增DataNode时候如果副本数量没达到要求会自动复制副本。
  (2)而kafka的副本数量表示为该topic的副本数量,当副本数量大于broker节点数量时会报错,这是因为分区是以目录存储在各个broker节点的data目录下,命名为:topicName-分区编号。当副本数量大于broker节点时就表示在同一个Broker节点的data目录下有两个一样的文件夹,这是不允许的。
2.kafka的分区数量可以大于broker节点数量,当分区数量大于broker节点数量时,在broker节点的data目录下会有同一个topic的两个分区的数据,如:topicName-0,topicName-1。

(5)手动调整分区副本存储

在生产环境中,每台服务器的配置和性能不一致,但是Kafka只会根据自己的代码规则创建对应的分区副本,就会导致个别服务器存储压力较大。所有需要手动调整分区副本的存储。

需求:创建一个新的topic,4个分区,两个副本,名称为three。将 该topic的所有副本都存储到broker0和broker1两台服务器上。

在这里插入图片描述

手动调整分区副本存储的步骤如下:
1)创建一个新的 topic,名称为 three。

[zrclass@hadoop102 kafka]$ bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --create --partitions 4 --replication-factor 2 --topic three

2)查看分区副本存储情况。

[zrclass@hadoop102 kafka]$ bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic three

3)创建副本存储计划(所有副本都指定存储在 broker0、broker1 中)。

[zrclass@hadoop102 kafka]$ vim increase-replication-factor.json

输入如下内容:

{
"version":1,
"partitions":[
{"topic":"three","partition":0,"replicas":[0,1]},
{"topic":"three","partition":1,"replicas":[0,1]},
{"topic":"three","partition":2,"replicas":[1,0]},
{"topic":"three","partition":3,"replicas":[1,0]}
]
} 

4)执行副本存储计划。

[zrclass@hadoop102 kafka]$ bin/kafka-reassign-partitions.sh --bootstrap-server hadoop102:9092 --reassignment-json-file increase-replication-factor.json --execute

5)验证副本存储计划。

[zrclass@hadoop102 kafka]$ bin/kafka-reassign-partitions.sh --bootstrap-server hadoop102:9092 --reassignment-json-file increase-replication-factor.json --verify

6)查看分区副本存储情况。

[zrclass@hadoop102 kafka]$ bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic three

4.kafka文件存储

(1)topic数据存储机制

​ Topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log文件,该log文件中存储的就是Producer生产的数 据。Producer生产的数据会被不断追加到该log文件末端,为防止log文件过大导致数据定位效率低下,Kafka采取了分片索引机制, 将每个partition分为多个segment。每个segment包括:“.index”文件、“.log”文件和.timeindex等文件。这些文件位于一个文件夹下,该 文件夹的命名规则为:topic名称+分区序号,例如:first-0。

在这里插入图片描述

(2)topic数据存储位置

1)启动生产者,并发送消息。

[zrclass@hadoop102 kafka]$ bin/kafka-console-producer.sh --bootstrap-server hadoop102:9092 --topic first

\>hello world

2)查看 hadoop102(或者 hadoop103、hadoop104)的/opt/module/kafka/datas/first-1 (first-0、first-2)路径上的文件。

[zrclass@hadoop104 first-1]$ ls
00000000000000000092.index
00000000000000000092.log
00000000000000000092.snapshot
00000000000000000092.timeindex
leader-epoch-checkpoint
partition.metadata

3)直接查看 log 日志,发现是乱码。

[zrclass@hadoop104 first-1]$ cat 00000000000000000092.log 

CYnF|©|©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"hello world

4)通过工具查看 index 和 log 信息。

[zrclass@hadoop104 first-1]$ kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.index 

Dumping ./00000000000000000000.index
offset: 3 position: 152

[zrclass@hadoop104 first-1]$ kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.log

Dumping datas/first-0/00000000000000000000.log
Starting offset: 0

baseOffset: 0 lastOffset: 1 count: 2 baseSequence: -1 lastSequence: -1 producerId: -1 
producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 0 CreateTime: 1636338440962 size: 75 magic: 2 compresscodec: none crc: 2745337109 isvalid: true

baseOffset: 2 lastOffset: 2 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 
producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 75 CreateTime: 1636351749089 size: 77 magic: 2 compresscodec: none crc: 273943004 isvalid: true

baseOffset: 3 lastOffset: 3 count: 1 baseSequence: -1 lastSequence: -1 producerId: -1 
producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 152 CreateTime: 1636351749119 size: 77 magic: 2 compresscodec: none crc: 106207379 isvalid: true

baseOffset: 4 lastOffset: 8 count: 5 baseSequence: -1 lastSequence: -1 producerId: -1 
producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 229 CreateTime: 1636353061435 size: 141 magic: 2 compresscodec: none crc: 157376877 isvalid: true

baseOffset: 9 lastOffset: 13 count: 5 baseSequence: -1 lastSequence: -1 producerId: -1 
producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 370 CreateTime: 1636353204051 size: 146 magic: 2 compresscodec: none crc: 4058582827 isvalid: true

(3)index文件和log文件详解

在这里插入图片描述

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

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

相关文章

ES6 新特性的let--const 解构赋值--模板字符串--对象相关新特性--箭头函数--综合代码示例

目录 ES6 新特性 ES6 基本介绍 ES6 是什么? let 声明变量 演示 let 的基本使用 注意事项和使用细节 代码演示 : const 声明常量/只读变量 应用实例 注意事项和使用细节 解构赋值 基本介绍 应用实例-数组解构 应用实例-对象解构 模板字符串 基本介绍 应用实例…

一次说透,4大服务性幂等场景架构设计方案!

服务幂等性架构设计 作者: 博学谷狂野架构师GitHub:GitHub地址 (有我精心准备的130本电子书PDF) 只分享干货、不吹水,让我们一起加油!😄 防重表实现幂等 对于防止数据重复提交,还有一种解决方案…

delta.io 数据湖 checkpoint是什么

checkpoint的直观表现 插入操作 --- /tmp/delta-table/_delta_log 路径下文件的作用 delta-table 是表名 我执行的操作: INSERT OVERWRITE delta.`/tmp/delta-table` SELECT col1 as id FROM VALUES 7,22; 对应的操作日志: /tmp/delta-table/_delta_log/00000000000000…

PPOCR -训练模型转推理模型遇到的问题

前言 使用PPOCR命令行训练验证码单字位置检测识别模型的情况下,这两个checkpoint训练模型测试图片均没出现问题,但转为inference推理模型的时候,问题来了。 问题1:文字检测的训练模型转为推理模型结果全为空 官方文档中确实有提…

ClickHouse初级

ClickHouse初级 一、ClickHouse的特点1.列式存储2.DBMS的功能3.多样化引擎4.高吞吐写入能力 LSM Tree5.数据分区与线程级并行6.性能对比 二、ClickHouse安装三、数据类型3.1整型3.2浮点型3.3 布尔型3.4 Decimal型3.5 字符串3.6 枚举类型3.7 时间类型3.8 数组 四、表引擎4.1 表引…

Semantic Kernel 知多少 | 开启面向 AI 编程新篇章

在 ChatGPT 火热的当下, 即使没有上手亲自体验,想必也对 ChatGPT 的强大略有耳闻。当一些人在对 ChatGPT 犹犹豫豫之时,一些敏锐的企业主和开发者们已经急不可耐地开展基于 ChatGPT 模型 AI 应用的落地探索。 因此,可以明确预见的是&#xf…

生信刷题之ROSALIND——Part 3

目录 1、Mortal Fibonacci RabbitsProblemSample DatasetSample OutputCodeOutput 2、Overlap GraphsProblemSample DatasetSample OutputCodeOutput 3、Calculating Expected OffspringProblemSample DatasetSample OutputCodeOutput 4、Finding a Shared MotifProblemSample …

TF卡目录显示文件夹变0字节的方法

关于电脑上的目录打不开是什么原因,电脑目录打不开是什么原因这个许多人还不清楚,今天小编来为大家解答目录打不开状况,此刻让好多人一起来瞧瞧吧! TF卡目录显示文件夹变0字节的方法 工具/软件:sayRecy 步骤1&#xff…

ref的使用与数组中的最全的使用方法

目录 1.ref的使用 什么是 ref 引用? 使用ref引用组件实例 2. this.$nextTick(cd) 方法 数组中的方法 1.some方法 --- 查找到目标元素后就停止后面的查找 2.every----判断每一项是否都满足要求 3.reduce方法 4. filter()方法 5. map()方法 6. forEach()方法…

2023年第十二届数据技术嘉年华(DTC)资料分享

第十二届数据技术嘉年华(DTC 2023)已于4月8日在北京圆满落幕,大会围绕“开源融合数智化——引领数据技术发展,释放数据要素价值”这一主题,共设置有1场主论坛,12场专题论坛,68场主题演讲&#x…

低调且强大——JNPF低代码平台

前言 先说说很多人为什么要用低代码平台。大部分的反馈是“懒”,其次就是后台管理这东西吧,来来回回就那些东西,查询/表单/表格/弹窗之类的,加上一些增删改查的逻辑。很多人表示,呆过的公司好几家了,后管的…

《低代码PaaS驱动集团企业数字化创新白皮书》-未来展望

未来展望 低代码PaaS发展的机遇 低代码开发可以帮助企业灵活搭建数字化应用,满足企业各业务部门的个性化、碎片化需求。根据IDC调研结果显示,当前低代码开发主要应用于面向企业内部的应用,占该应用总量的比例达到 11.6%;其次是面…

debug的用法和方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言debug三种方式 1.按照条件输出 2.进入方法 3.回退到上一个方法 一、debug是什么?二、使用步骤1.方法debug 在条件输出的时候按照条件输出进入方法内…

idea好用插件分享——Bito-ChatGPT

文章目录 安装步骤:第一步:打开Setting第二步:选择Plugins,输入Bito,就可以搜索出来了,再点击安装第三步:安装完成回到IDEA主界面,右边区域可以看到Bito图标,点击展开&am…

Java---异常概述

(一)认识Java的异常 1、什么是异常 在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户…

【软件工程】UML序列图

一.概述 序列图(时序图)是一种软件工程行化建模方法,用于可视化系统或应用程序中多个对象之间 的交互。在序列图中,每个对象都表示为竖直线,对象之间的消息则表示为水平箭头 从一个对象指向另一个对象。 序列图可以…

Canvas实现动态绘制圆周效果|实现奥运五环

步骤实现: 首先,创建一个 HTML 画布和一个 JavaScript 动画函数。 在画布上绘制一个圆。 定义一个变量来表示圆心的坐标和半径。 进行动画循环以更新圆心坐标,使其沿外圆周运动。 使用三角函数(如 sin 和 cos)来计…

如何带领小微企业在软件开发行业生存

文章目录 前言一、企业急需的技术人才需要掌握的技能二、人工智能开发者技能三、领导者需要掌握的知识和技能四、具备敏锐的技术视野的方法和途径五、人工智能技术论坛及组织六、机器学习相关论坛和组织七、新技术如何应用和落地1、了解新技术2、确定应用场景3、进行实践验证4、…

Pinia与Vuex区别、Pinia安装与使用

目录 一、Pinia和Vuex区别 二、Pinia使用state、getters、actions 1、安装使用Pinia 2、State 3、actions 4、getters 三、Pinia划分模块 1、目录结构 2、store/user.js 3、某组件使用 四、Pinia持久化存储 1、安装插件 2、store/index.js 3、store/user.js 4、…

Linux 内核设计与实现

文章目录 一、前言二、进程管理1、task_struct2、thread_info 三、调度四、系统调用五、内核数据结构1、kfifo2、映射3、二叉树 六、中断1、软中断2、tasklet3、工作队列4、下半部机制的选择5、下半部禁止与使能 七、内核同步方法1、原子操作2、自旋锁(1&#xff09…