# Kafka_深入探秘者(5):kafka 分区

Kafka_深入探秘者(5):kafka 分区

一、kafka 副本机制

1、Kafka 可以将主题划分为多个分区(Partition),会根据分区规则选择把消息存储到哪个分区中,只要如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实现了负载均衡和水平扩展。另外,多个订阅者可以从一个或者多个分区中同时消费数据,以支撑海量数据处理能力。

2、由于 kafka 消息是以追加到分区中的,多个分区顺序写磁盘的总效率要比随机写内存还要高(引用 ApacheKafka-A High Throughput Distributed Messaging System 的观点),是 Kafka 高吞吐率的重要保证之一。

3、kafka 副本机制

  • 1)在由于 Producer 和 Consumer 都只会与 Leader 角色的分区副本相连,所以 kafka 需要以集群的组织形式提供主题下的消息高可用。kafka 支持主备复制,所以消息具备高可用和持久性。

  • 2)kafka 一个分区可以有多个副本,这些副本保存在不同的 broker 上。每个分区的副本中都会有一个作为 Leader。当一个 broker 失败时,Leader 在这台 broker 上的分区都会变得不可用,kafka 会自动移除 Leader,再其他副本中选一个作为新的 Leader。

  • 3)在通常情况下,增加分区可以提供 kafka 集群的吞吐量。然而,也应该意识到集群的总分区数或是单台服务器上的分区数过多,会增加不可用及延迟的风险。

kafka集群.png

二、kafka Leader 选举

1、Kafka 可以预见的是,如果某个分区的 Leader 挂了,那么其它跟随者将会进行选举产生一个新的 leader,之后所有的读写就会转移到这个新的 Leader 上,在 kafka 中,其不是采用常见的多数选举的方式进行副本的 Leader 选举,而是会在 Zookeeper 上针对每个 Topic 维护一个称为 ISR(in-syncreplica,已同步的副本)的集合,显然还有一些副本没有来得及同步。只有这个 ISR 列表里面的才有资格成为 leader (先使用ISR里面的第一个,如果不行依次类推,因为 ISR 里面的是同步副本,消息是最完整且各个节点都是一样的)。

2、kafka 通过 ISR,kafka 需要的冗余度较低,可以容忍的失败数比较高。假设某个 topic 有 f+1 个副本,kafka 可以容忍 f 个不可用,当然,如果全部 ISR 里面的副本都不可用,也可以选择其他可用的副本,只是存在数据的不一致。

3、Leader 选举随机示例图:

Leader选举随机示例图.png

三、kafka 分区重新分配 001

1、部署好的 Kafka 集群里面添加机器是最正常不过的需求,而且添加起来非常地方便,从已经部署好的 Kafka 节点中复制相应的配置文件,然后把里面的 brokerid 修改成全局唯一的,最后启动这个节点即可将它加入到现有 Kafka 集群中。

2、新添加的 Kafka 节点并不会自动地分配数据,所以无法分担集群的负载,除非我们新建一个 topic。 手动将部分分区移到新添加的 Kafka 节点上,Kafka 内部提供了相关的工具来重新分布某个 topic 的分区。

3、kafka 集群搭建:

3.1 拷贝三份 kafka_2.12-2.8.0 分别命名为:kafka-01, kafka-02, kafka-03

# 切换目录
cd /usr/local/kafka/# 拷贝三份 kafka_2.12-2.8.0 分别命名为:kafka-01, kafka-02, kafka-03
cp -rf kafka_2.12-2.8.0 ./kafka-01 
cp -rf kafka_2.12-2.8.0 ./kafka-02
cp -rf kafka_2.12-2.8.0 ./kafka-03
3.2 修改 kafka-01 的配置文件 kafka/kafka-01/config/server.properties

broker.id=0, log.dirs=/usr/local/kafka/kafka-01/logs, port=9092


# 切换目录
cd /usr/local/kafka/# 修改 kafka-01 的配置文件 kafka-01/config/server.properties
vim kafka-01/config/server.properties# 修改以下几个配置:broker.id=0 
log.dirs=/usr/local/kafka/kafka-01/logs 
# listeners=PLAINTEXT://localhost:9092
# host.name=localhost
# port=9092# 或者把 localhost 换成 填写你的 虚拟机 IP 地址(如:172.18.30.110):
listeners=PLAINTEXT://172.18.30.110:9092
3.3 修改 kafka-02 的配置文件 kafka/kafka-02/config/server.properties

broker.id=1, log.dirs=/usr/local/kafka/kafka-02/logs, port=9093


# 切换目录
cd /usr/local/kafka/# 修改 kafka-02 的配置文件 kafka-02/config/server.properties
vim kafka-02/config/server.properties# 修改以下几个配置:broker.id=1 
log.dirs=/usr/local/kafka/kafka-02/logs 
# listeners=PLAINTEXT://localhost:9093
# host.name=localhost
# port=9093# 或者把 localhost 换成 填写你的 虚拟机 IP 地址(如:172.18.30.110):
listeners=PLAINTEXT://172.18.30.110:9093
3.4 修改 kafka-03 的配置文件 kafka/kafka-03/config/server.properties

broker.id=2, log.dirs=/usr/local/kafka/kafka-03/logs, port=9094


# 切换目录
cd /usr/local/kafka/# 修改 kafka-03 的配置文件 kafka-03/config/server.properties
vim kafka-03/config/server.properties# 修改以下几个配置:broker.id=2 
log.dirs=/usr/local/kafka/kafka-03/logs 
# listeners=PLAINTEXT://localhost:9094
# host.name=localhost
# port=9094# 或者把 localhost 换成 填写你的 虚拟机 IP 地址(如:172.18.30.110):
listeners=PLAINTEXT://172.18.30.110:9094
3.5 删除 kafka 三个节点 kafka-01, kafka-02, kafka-03 以前的日志文件。

删除命令:rm -rf logs/*


# 切换目录
cd /usr/local/kafka/# 删除 节点1:kafka-01 以前的日志文件
rm -rf kafka-01/logs/* # 删除 节点2:kafka-02 以前的日志文件
rm -rf kafka-02/logs/* # 删除 节点3:kafka-03 以前的日志文件
rm -rf kafka-03/logs/* 
3.6 启动 kafka 三个节点 kafka-01, kafka-02, kafka-03

启动命令:bin/kafka-server-start.sh config/server.properties


# 切换目录
cd /usr/local/kafka/# 启动 节点1:kafka-01
kafka-01/bin/kafka-server-start.sh kafka-01/config/server.properties# 启动 节点2:kafka-02 
kafka-02/bin/kafka-server-start.sh kafka-02/config/server.properties# 启动 节点3:kafka-03 
kafka-03/bin/kafka-server-start.sh kafka-03/config/server.properties

四、kafka 分区重新分配 002

1、Kafka 创建一个有3个节点的集群(3个分区,3个副本)

创建命令:
bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic heima-par --partitions 3 --replication-factor 3


# 切换目录
cd /usr/local/kafka/# 创建集群
kafka-01/bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic heima-par --partitions 3 --replication-factor 3# 或者把 localhost 换成 填写你的 虚拟机 IP 地址(如:172.18.30.110):
kafka-01/bin/kafka-topics.sh --create --zookeeper 172.18.30.110:2181 --topic heima-par --partitions 3 --replication-factor 3# 查看新创建的主题 heima-par 的详细信息
kafka-01/bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic heima-par

在这里插入图片描述

2、为新创建的主题 heima-par 添加一个分区

添加分区命令:
bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic heima-par --partitions 4


# 切换目录
cd /usr/local/kafka/# 创建集群
kafka-01/bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic heima-par --partitions 4# 或者把 localhost 换成 填写你的 虚拟机 IP 地址(如:172.18.30.110):
kafka-01/bin/kafka-topics.sh --alter --zookeeper 172.18.30.110:2181 --topic heima-par --partitions 4# 查看新创建的主题 heima-par 的详细信息
kafka-01/bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic heima-par# 或者把 localhost 换成 填写你的 虚拟机 IP 地址(如:172.18.30.110):
kafka-01/bin/kafka-topics.sh --describe --zookeeper 172.18.30.110:2181 --topic heima-par

在这里插入图片描述

3、添加一个 brokder 节点

添加 brokder 节点 命令:
cp -rf kafka-01 ./kafka-04


# 切换目录
cd /usr/local/kafka/# 添加 brokder 节点
cp -rf kafka-01 ./kafka-04

在这里插入图片描述

4、修改 节点 kafka-04 的配置文件 kafka/kafka-04/config/server.properties

broker.id=3, log.dirs=/usr/local/kafka/kafka-04/logs, port=9095


# 切换目录
cd /usr/local/kafka/# 修改 kafka-04 的配置文件 kafka-04/config/server.properties
vim kafka-04/config/server.properties# 修改以下几个配置:broker.id=3 
log.dirs=/usr/local/kafka/kafka-04/logs 
# listeners=PLAINTEXT://localhost:9095
# host.name=localhost
# port=9095# 或者把 localhost 换成 填写你的 虚拟机 IP 地址(如:172.18.30.110):
listeners=PLAINTEXT://172.18.30.110:9095

在这里插入图片描述

5、删除 kafka 4个节点 kafka-01, kafka-02, kafka-03, kafka-04 以前的日志文件。

删除命令:rm -rf logs/*


# 切换目录
cd /usr/local/kafka/# 删除 节点1:kafka-01 以前的日志文件
rm -rf kafka-01/logs/* # 删除 节点2:kafka-02 以前的日志文件
rm -rf kafka-02/logs/* # 删除 节点3:kafka-03 以前的日志文件
rm -rf kafka-03/logs/* # 删除 节点4:kafka-04 以前的日志文件
rm -rf kafka-04/logs/* 
6 启动 kafka 4个节点 kafka-01, kafka-02, kafka-03, kafka-04

启动命令:bin/kafka-server-start.sh config/server.properties


# 切换目录
cd /usr/local/kafka/# 启动 节点1:kafka-01
kafka-01/bin/kafka-server-start.sh kafka-01/config/server.properties# 启动 节点2:kafka-02 
kafka-02/bin/kafka-server-start.sh kafka-02/config/server.properties# 启动 节点3:kafka-03 
kafka-03/bin/kafka-server-start.sh kafka-03/config/server.properties# 启动 节点4:kafka-04 
kafka-04/bin/kafka-server-start.sh kafka-04/config/server.properties

7、再次查看新创建的主题 heima-par 的详细信息,发现输出信息中新添加的节点4并没有分配之前主题的分区。


# 切换目录
cd /usr/local/kafka/# 查看新创建的主题 heima-par 的详细信息
kafka-01/bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic heima-par# 或者把 localhost 换成 填写你的 虚拟机 IP 地址(如:172.18.30.110):
kafka-01/bin/kafka-topics.sh --describe --zookeeper 172.18.30.110:2181 --topic heima-par

在这里插入图片描述

五、kafka 分区重新分配 003

将原先分布在 broker 1-3 节点上的分区重新分布到 broker 1-4 节点上,需要借助 kafka-reassign-partitions.sh 工具生成 reassign plan ,

1、定义一个 reassign.json 文件,说明哪些 topic 需要重新分区,文件内容如下:


# 切换目录
cd /usr/local/kafka/# 定义一个 reassign.json 文件
vim kafka-01/reassign.json# 文件内容如下{"topics":[{"topic":"heima-par"}],
"version":1
}

2、使用 kafka-reassign-partitions.sh 工具生成 reassign plan

命令:
bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --topics-to-move-json-file reassign.json --broker-list “0,1,2,3” --generate

命令参数说明:
-generate :表示指定类型参数。
–topics-to-move-json-file : 指定分区重份配对应的主题清单路径。


# 切换目录
cd /usr/local/kafka/# 使用 kafka-reassign-partitions.sh 工具生成 reassign plan
kafka-01/bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --topics-to-move-json-file kafka-01/reassign.json --broker-list "0,1,2,3" --generate# 或者把 localhost 换成 填写你的 虚拟机 IP 地址(如:172.18.30.110):
kafka-01/bin/kafka-reassign-partitions.sh --zookeeper 172.18.30.110:2181 --topics-to-move-json-file kafka-01/reassign.json --broker-list "0,1,2,3" --generate# 执行完命令会生成2个字符串。
Current partition replica assignment
{"version":1,"partitions":[{"topic":"heima-par","partition":0,"replicas":[0,2,1],"log_dirs":["any","any","any"]},{"topic":"heima-par","partition":1,"replicas":[1,0,2],"log_dirs":["any","any","any"]},{"topic":"heima-par","partition":2,"replicas":[2,1,0],"log_dirs":["any","any","any"]},{"topic":"heima-par","partition":3,"replicas":[0,2,1],"log_dirs":["any","any","any"]}]}Proposed partition reassignment configuration
{"version":1,"partitions":[{"topic":"heima-par","partition":0,"replicas":[3,1,2],"log_dirs":["any","any","any"]},{"topic":"heima-par","partition":1,"replicas":[0,2,3],"log_dirs":["any","any","any"]},{"topic":"heima-par","partition":2,"replicas":[1,3,0],"log_dirs":["any","any","any"]},{"topic":"heima-par","partition":3,"replicas":[2,0,1],"log_dirs":["any","any","any"]}]}

在这里插入图片描述

3、重新分配 JSON 文件,创建 result.json 文件,保存 JSON 内容。

注意:第二步命令输出两个 json 字符串,第一个 JSON 内容为当前的分区副本分配情况,第二个为重新分配的候选方案,注意这里只是生成一份可行性的方案,并没有真正执行重分配的动作。

我们将第二个 JSON 内容保存到名为 result.json 文件里面(文件名不重要,文件格式也不一定要以json为结尾,只要保证内容是 json 即可),然后执行这些 reassign plan:

# 切换目录
cd /usr/local/kafka/# 创建并编辑 result.json 文件。
vim kafka-01/result.json## 粘贴以下内容:{"version":1,"partitions":[{"topic":"heima-par","partition":0,"replicas":[3,1,2],"log_dirs":["any","any","any"]},{"topic":"heima-par","partition":1,"replicas":[0,2,3],"log_dirs":["any","any","any"]},{"topic":"heima-par","partition":2,"replicas":[1,3,0],"log_dirs":["any","any","any"]},{"topic":"heima-par","partition":3,"replicas":[2,0,1],"log_dirs":["any","any","any"]}]}

4、执行分配策略,并查看执行进度。

命令:
bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file result.json --execute

命令参数说明:
–execute :执行命令。
–reassignment-json-file : 指定分区重分配 json 文件。


# 切换目录
cd /usr/local/kafka/# 使用 kafka-reassign-partitions.sh 工具生成 reassign plan
kafka-01/bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file kafka-01/result.json --execute# 或者把 localhost 换成 填写你的 虚拟机 IP 地址(如:172.18.30.110):
kafka-01/bin/kafka-reassign-partitions.sh --zookeeper 172.18.30.110:2181 --reassignment-json-file kafka-01/result.json --execute# 查看执行进度
kafka-01/bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file kafka-01/result.json --verify# 或者把 localhost 换成 填写你的 虚拟机 IP 地址(如:172.18.30.110):
kafka-01/bin/kafka-reassign-partitions.sh --zookeeper 172.18.30.110:2181 --reassignment-json-file kafka-01/result.json --verify# 查看新创建的主题 heima-par 的详细信息
kafka-01/bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic heima-par# 或者把 localhost 换成 填写你的 虚拟机 IP 地址(如:172.18.30.110):
kafka-01/bin/kafka-topics.sh --describe --zookeeper 172.18.30.110:2181 --topic heima-par

在这里插入图片描述

六、kafka 分区分配策略

1、### 1、按照 Kafka 默认的消费逻辑设定,一个分区只能被同一个消费组 (ConsumerGroup) 内的一个消费者消费。假设目前某消费组内只有一个消费者 C0,订阅了一个 topic,这个 topic 包含 7 个分区,也就是说这个消费者 C0 订阅了 7 个分区,参考下图1

2、此时消费组内又加入了一个新的消费者 C1,按照既定的逻辑需要将原来消费者 C0 的部分分区分配给消费者 C1 消费,情形如图(2),消费者 C0 和 C1 各自负责消费所分配到的分区,相互之间并无实质性的干扰。

kafka分区分配策略1.png

3、RangeAssignor 策略的原理

RangeAssignor 策略的原理是按照消费者总数和分区总数进行整除运算来获得一个跨度,然后将分区按照跨度进行平均分配,以保证分区尽可能均匀地分配给所有的消费者。对于每一个 topic,RangeAssignor 策略会将消费组内所有订阅这个 topic 的消费者按照名称的字典序排序,然后为每个消费者划分固定的分区范围,如果不够平均分配,那么字典序靠前的消费者会被多分配一个分区。

4、RoundRobinAssignor 策略的原理

RoundRobinAssignor 策略的原理是将消费组内所有消费者以及消费者所订阅的所有 topic 的 partition 按照字典序排序,然后通过轮询方式逐个将分区以此分配给每个消费者。RoundRobinAssignor 策略对应的 partition.assignment.strategy 参数值为: org.apache.kafka.clients.consumer.RoundRobinAssignor。

上一节关联链接请点击

# Kafka_深入探秘者(4):kafka 主题 topic

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

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

相关文章

CesiumJS【Basic】- #014 Entity和Primitive的flyTo

文章目录 Entity和Primitive的flyTo1 目标2 实现2.1 实体对象定位2.2 图元对象定位Entity和Primitive的flyTo 1 目标 实体对象和图元对象定位 2 实现 2.1 实体对象定位 实体对象定位可以使用Cesium.Viewer的flyTo方法。由于target参数可以是一个Entity,所以直接调用即可。…

Golang | Leetcode Golang题解之第198题打家劫舍

题目&#xff1a; 题解&#xff1a; func rob(nums []int) int {if len(nums) 0 {return 0}if len(nums) 1 {return nums[0]}first : nums[0]second : max(nums[0], nums[1])for i : 2; i < len(nums); i {first, second second, max(first nums[i], second)}return se…

【Android面试八股文】WebView如何做资源缓存的?

文章目录 引言1. Android WebView的性能问题1.1 H5页面加载速度慢1.1.1 渲染速度慢1.1.2 页面资源加载缓慢1.1.3 总结1.2 耗费流量1.3 总结2. 上述问题的解决方案2.1 前端H5的缓存机制2.1.1 定义2.1.2 作用2.1.3 具体应用2.2 缓存机制2.2.1 浏览器缓存机制 (HTTP Cache)原理特点…

whisper 实现语音转文字

准备需要转码的音频 https://support.huaweicloud.com/sdkreference-sis/sis_05_0039.html 编码转吗的代码 import whisperif __name__ "__main__":file_path "16k16bit.wav"model whisper.load_model("small")result model.transcribe(f…

掌握Vim的艺术:精通diff模式的比较与合并

标题&#xff1a;掌握Vim的艺术&#xff1a;精通diff模式的比较与合并 引言 在软件开发和文本编辑中&#xff0c;比较文件差异是一项常见任务。Vim&#xff0c;作为一款功能强大的文本编辑器&#xff0c;提供了一个内置的diff模式&#xff0c;使得文件比较变得直观和高效。本…

openEuler离线安装nginx

目录 1.创建储存目录 2.切换到储存目录 3.首先在外网的环境下下载nginx的rpm包 4.目录打包tar包拷贝到离线路径 5.安装nginx 6.启动 nginx 7.停止 nginx 8.重新加载 nginx 配置 9.重新启动 nginx&#xff08;先停止再启动 nginx&#xff09; 10.检查 nginx 服务…

【分布式系统】Zookeeper学习笔记

基本概念 Zookeeper工作机制 从设计模式角度理解: 是一个基于观察者模式设计的分布式服务管理框架; 负责存储和管理大家都关心的数据, 一旦这些数据的状态发生变化, Zookeeper就将负责通知已经在Zookeeper上注册的那些观察值做出相应的反应. Zookeeper特点 Zookeeper有: 一…

强化Linux系统安全:利用Tripwire防御文件完整性攻击

摘要 在日益复杂的网络安全环境中&#xff0c;保护Linux系统的文件完整性是维护系统安全的关键。Tripwire作为一种高效的文件完整性监控工具&#xff0c;能够帮助系统管理员检测和响应未授权的文件更改。本文将从网络安全专家的角度&#xff0c;指导如何部署和使用Tripwire&am…

QT中线程同步的互斥量QMutex与QRecursiveMutex

在 Qt 中&#xff0c;有两种常用的互斥量类&#xff1a;QMutex 和 QRecursiveMutex。这两种互斥量类都用于在多线程环境中控制对共享资源的访问&#xff0c;确保线程安全性。下面是关于这两种互斥量类的详细说明&#xff1a; 1. QMutex&#xff1a; 功能&#xff1a;QMutex 是…

EdgeOne 边缘函数 + Hono.js + Fauna 搭建个人博客

一、背景 虽然 “博客” 已经是很多很多年前流行的东西了&#xff0c;但是时至今日&#xff0c;仍然有一部分人在维护自己的博客站点&#xff0c;输出不少高质量的文章。 我使用过几种博客托管平台或静态博客生成框架&#xff0c;前段时间使用Hono.jsFauna &#xff0c;基于 …

STM32教程 使用硬件SPI和模拟SPI驱动W25Q64芯片

STM32教程&#xff1a;使用硬件SPI和模拟SPI驱动W25Q64芯片 摘要 本教程详细介绍了如何在STM32微控制器上使用硬件SPI和模拟SPI来驱动W25Q64 Flash存储器。W25Q64是一款8Mbit的串行Flash存储器&#xff0c;适用于存储程序数据和用户数据。本教程将从SPI基本原理讲起&#xff…

第 10 课:PPML入门/基于SPU机器学习建模实践

本讲主要内容是PPML入门&#xff0c;即基于SPU进行隐私保护的机器学习的建模实践。通过本次学习&#xff0c;可以了解隐私保护机器学习以及隐语SPU的架构&#xff0c;通过实战可以了解如何基于隐语进行隐私保护的NN模型建模。 一、隐私保护机器学习背景 机器学习中的数据隐私问…

RK3568平台开发系列讲解(I2C篇)利用逻辑分析仪进行I2C总线的全面分析

🚀返回专栏总目录 文章目录 1. 基础协议1.1. 协议简介1.2. 物理信号1.3. 总线连接沉淀、分享、成长,让自己和他人都能有所收获!😄 1. 基础协议 1.1. 协议简介 IIC-BUS(Inter-IntegratedCircuit Bus)最早是由PHilip半导体(现在被NXP收购)于1982年开发。 主要是用来方…

将深度相机的实时三维坐标数据保存为excel文档(Python+Pyrealsense2+YOLOv8)

一、如何将数据保存为excel文档 1.excel文件库与相关使用 &#xff08;1&#xff09;导入相应的excel文件库&#xff0c;导入前先要进行pip安装&#xff0c;pip install xlwt import xlwt # 导入用于创建和写入Excel文件的库 (2) 建立一个excel文档&#xff0c;并在第0行写…

RabbitMQ中Direct交换机的用法

前言&#xff1a;比如我们的支付完成之后需要进行修改支付状态还要完成短信通知用户需要同时并发两条指令我们可以使用direct交换机进行指定两个不同的业务去完成这两件事 比如我们现在有direct.queue1/direct.queue2两个消息队列&#xff0c;一个direct交换机 我们创建完成两…

鸿蒙开发之--生命周期

开发官网 开发-HarmonyOS开发者-华为开发者联盟 UIAbility生命周期 1、首先执行onCreate(),用于页面初始化和设置页面逻辑 2、执行onWindowStageCreate()创建一个窗口&#xff0c;在这里可以使windowStage.loadContent(url&#xff0c;&#xff08;&#xff09;>{})打开一…

“拿来主义”学习无限滚动动画(附源码)

欢迎关注&#xff1a;xssy5431 小拾岁月 参考链接&#xff1a;https://mp.weixin.qq.com/s/xVTCwR1ZSn5goWmc2yimVA 动画效果 需求分析 需求中涉及无线滚动&#xff0c;说明需要使用 animation 动画。另外&#xff0c;为了方便用户点击操作&#xff0c;需要给滚动对象添加鼠标…

感谢我的辅导员—敬爱的罗老师

前言&#xff1a;快毕业了&#xff0c;想在毕业季感谢给予我帮助的老师&#xff0c;我的辅导员-罗老师是我最想感谢的大学老师。我不知道应该以什么样的方式去表达罗老师对我大学阶段的帮助&#xff0c;如果是直接发邮件&#xff0c;微信信息留言&#xff0c;可能在之后我和老师…

MySQL索引优化解决方案--索引优化(4)

排序优化 尽量避免使用Using FileSort方式排序。order by语句使用索引最左前列或使用where子句与order by子句条件组合满足索引最左前列。where子句中如果出现索引范围查询会导致order by索引失效。 优化案例 联表查询优化 分组查询优化 慢查询日志

架构是怎样练成的-楼宇监控系统案例

目录 概要 项目背景 原系统设计方案 改进后的设计方案 小结 概要 绝大多数人掌握的架构都是直接学习&#xff0c;慢慢地才能体会到一个架构的好处。架构是一种抽象&#xff0c;是为了复用目的而对代码做的抽象。通过一个项目的改造&#xff0c;理解架构是如何产生的&…