最大化效率和性能:AKS 中节点池的强大功能
什么是节点池
在 Azure Kubernetes 服务 (AKS) 中,相同配置的节点会被分组到节点池中。这些节点池包含运行应用程序的底层虚拟机。创建 AKS 集群时,您需要定义初始节点数及其大小 (SKU)。随着应用程序需求的变化,您可能需要更改节点池的设置。例如,您可能需要扩展节点池中的节点数或升级节点池的 Kubernetes 版本。
系统节点池和用户节点池是 AKS 集群的两种不同节点池模式。系统节点池主要用于托管关键系统 Pod,例如 CoreDNS 和 metrics-server。用户节点池主要用于托管应用程序 Pod。但是,如果您希望 AKS 集群中只有一个池,则可以将应用程序 Pod 调度到系统节点池中。每个 AKS 集群必须至少包含一个系统节点池,且至少包含两个节点。
为了支持具有不同计算或存储需求的应用程序,您可以创建用户节点池。系统节点池主要用于托管关键系统 Pod,例如 CoreDNS 和 konnectivity。用户节点池主要用于托管应用程序 Pod。例如,使用更多用户节点池为计算密集型应用程序提供 GPU,或访问高性能 SSD 存储。
节点池的分类和限制
对于系统节点池,AKS 会自动为其节点分配 kubernetes.azure.com/mode: system 标签。这会导致 AKS 优先在包含此标签的节点池上调度系统 Pod。此标签不会阻止您在系统节点池上调度应用程序 Pod。但是,我们建议您将关键系统 Pod 与应用程序 Pod 隔离,以防止配置错误或恶意应用程序 Pod 意外删除系统 Pod。
您可以通过创建专用系统节点池来强制执行此行为。使用 CriticalAddonsOnly=true:NoSchedule 污点来阻止在系统节点池上调度应用程序 Pod。
系统节点池具有以下限制:
- 系统节点池必须至少支持 30 个 Pod,如 Pod 的最小值和最大值公式所述。
- 系统池的操作系统类型必须是 Linux。
- 用户节点池的操作系统类型可以是 Linux 或 Windows。
- 系统池必须至少包含两个节点,而用户节点池可以包含零个或多个节点。
- 系统节点池要求虚拟机 SKU 至少包含 4 个 vCPU 和 4GB 内存。
- 系统节点池不支持 B 系列虚拟机。
- 建议至少使用三个 8 个 vCPU 的节点或两个至少 16 个 vCPU 的节点(例如 Standard_DS4_v2),尤其对于大型集群(多个 CoreDNS Pod 副本、3-4 个以上附加组件等)。
- Spot 节点池需要用户节点池。
- 添加另一个系统节点池或更改哪个节点池是系统节点池不会自动移动系统 Pod。即使您将节点池更改为用户节点池,系统 Pod 仍可继续在同一个节点池上运行。如果您删除或缩减运行先前属于系统节点池的系统 Pod 的节点池,这些系统 Pod 将按照优先调度的方式重新部署到新的系统节点池。
您可以对节点池执行以下操作:
- 创建专用的系统节点池(优先调度系统 Pod,而不是模式为“system”的节点池)
- 将系统节点池更改为用户节点池,前提是您有另一个系统节点池可以在 AKS 集群中替代它。
- 将用户节点池更改为系统节点池。
- 删除用户节点池。
- 您可以删除系统节点池,前提是您有另一个系统节点池可以在 AKS 集群中替代它。
- 一个 AKS 集群可以有多个系统节点池,并且至少需要一个系统节点池。
- 如果您想更改现有节点池中的各种不可变设置,可以创建新的节点池来替换它们。例如,添加一个具有新 maxPods 设置的新节点池并删除旧节点池。
- 使用节点亲和性可以根据节点标签来要求或优先安排哪些节点可以进行调度。您可以将键设置为 kubernetes.azure.com,将操作员设置为 In,并将用户或系统的值设置为您的 YAML,然后使用 kubectl apply -f yourYAML.yaml 应用此定义。
节点池的常用案例
创建包含系统节点池的新 AKS 集群
创建新的 AKS 群集时,初始节点池默认为系统类型模式。 使用 az aks nodepool add 创建新节点池时,除非显式指定 mode 参数,否则这些节点池为用户节点池。
使用 az aks create 命令创建 AKS 群集。以下示例创建一个名为 myAKSCluster 的群集,其中包含一个包含两个节点的专用系统池。对于生产工作负荷,请确保使用至少包含三个节点的系统节点池。此操作可能需要几分钟才能完成。
az aks create --resource-group myResourceGroup --name myAKSCluster --node-count 2 --generate-ssh-keys
向现有 AKS 集群添加专用系统节点池
您可以向现有 AKS 集群添加一个或多个系统节点池。建议将应用程序 Pod 调度到用户节点池中,并将系统节点池专用于关键系统 Pod。这可以防止恶意应用程序 Pod 意外删除系统 Pod。您可以使用系统节点池的 CriticalAddonsOnly=true:NoSchedule 污点来强制执行此行为。
以下命令将添加一个模式类型为 system 的专用节点池,默认节点数为 3 个。
az aks nodepool add --resource-group myResourceGroup --cluster-name myAKSCluster --name systempool --node-count 3 --node-taints CriticalAddonsOnly=true:NoSchedule --mode System
向现有AKS 群集添加 Spot 节点池
将 Spot 节点池添加到现有集群时,该集群必须是启用了多个节点池的集群。创建启用了多个节点池的 AKS 集群时,默认情况下会创建一个优先级为“常规”的节点池。要添加 Spot 节点池,必须将优先级的值指定为“Spot”。
export SPOT_NODEPOOL="spotnodepool"
export AKS_CLUSTER="myakscluster"
export RESOURCE_GROUP="myaksgroup"az aks nodepool add --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER --name $SPOT_NODEPOOL --priority Spot --eviction-policy Delete --spot-max-price -1 --enable-cluster-autoscaler --min-count 1 --max-count 3 --no-wait
在新集群上启用Cluster Autoscaler
集群通常需要一种自动扩展的方式,以适应不断变化的应用程序需求,例如在工作日与晚上或周末之间。AKS 集群可以通过以下方式扩展:
- 集群自动扩展器会定期检查由于资源限制而无法在节点上调度的 Pod。然后,集群会自动增加节点数量。使用集群自动扩展器时,手动扩展功能将被禁用。
- 水平 Pod 自动扩展器使用 Kubernetes 集群中的 Metrics Server 来监控 Pod 的资源需求。如果应用程序需要更多资源,则会自动增加 Pod 数量以满足需求。
- 垂直 Pod 自动扩展器会根据过去的使用情况自动设置每个工作负载的资源请求和容器限制,以确保 Pod 被调度到具有所需 CPU 和内存资源的节点上。
az aks create --resource-group myResourceGroup --name myAKSCluster --node-count 1 --vm-set-type VirtualMachineScaleSets --load-balancer-sku standard --enable-cluster-autoscaler --min-count 1 --max-count 3 --generate-ssh-keys
在节点池上启用 Artifact Streaming,减少映像拉取时间
在不断发展的云原生应用领域中,缩短部署时间对于维持高效的工作流程至关重要。Azure Kubernetes 服务 (AKS) 推出了 Artifact Streaming 功能,旨在显著缩短镜像拉取时间,从而提升 AKS 部署的性能。
什么是 Artifact Streaming?
Artifact Streaming 允许 AKS 直接从 Azure 容器注册表 (ACR) 流式传输容器镜像。AKS 不会一次性拉取整个镜像,而是只拉取 Pod 初始启动所需的必要层,从而缩短整体镜像拉取时间并加快部署速度。
主要优势
- 更快的部署:Artifact Streaming 可将 Pod 就绪时间缩短 15% 以上,尤其适用于小于 30GB 的镜像。
- 并发 Pod 启动:Pod 可以并发启动,而不是串行启动,从而提高部署效率。
- 优化资源利用:通过减少拉取大型镜像所需的时间,帮助避免拥堵。
先决条件
在启用 Artifact Streaming 之前,请确保您已具备:
- 一个集成了 ACR 的现有 AKS 集群。
- Kubernetes 1.25 或更高版本。
- Ubuntu 22.04、Ubuntu 20.04 或 Azure Linux 节点池(不支持 Windows 节点池)。
具体的步骤
1. 安装 aks-preview CLI 扩展
首先,安装并更新 aks-preview CLI 扩展,以确保您拥有最新版本:
az extension add --name aks-preview
az extension update --name aks-preview
2. 注册 ArtifactStreamingPreview 功能
为您的订阅注册 ArtifactStreamingPreview 功能:
az feature register --namespace Microsoft.ContainerService --name ArtifactStreamingPreview
3. 在 ACR 上启用 Artifact Streaming
创建资源组和 ACR 实例,然后在您的 ACR 上启用 Artifact Streaming:
az group create --name myStreamingTest --location westus
az acr create --resource-group myStreamingTest --name mystreamingtest --sku Premium
az configure --defaults acr="mystreamingtest"
az acr import --source docker.io/jupyter/all-spark-notebook:latest --repository jupyter/all-spark-notebook:latest
az acr artifact-streaming create --image jupyter/all-spark-notebook:latest
az acr manifest list-referrers --name jupyter/all-spark-notebook:latest
4. 在 AKS 上启用 Artifact Streaming
对于新节点池:
创建一个启用 Artifact Streaming 的新节点池:
az aks nodepool add \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name myNodePool \
--enable-artifact-streaming
对于现有节点池:
更新现有节点池以启用 Artifact Streaming:
az aks nodepool update \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name myNodePool \
--enable-artifact-streaming
5. 验证 Artifact Streaming
检查 Artifact Streaming 是否已启用:
az aks nodepool show --resource-group myResourceGroup --cluster-name myAKSCluster --name myNodePool --query artifactStreamingProfile
确保“Enabled”字段设置为 true。
AKS 集群节点池大小调整
何时需要调整节点池大小
以下是调整 AKS 集群节点池大小的一些常见原因:
- 性能优化:增加节点池中节点的大小可以提高 AKS 集群中运行应用程序的性能。如果您注意到资源限制或计算资源不足导致的性能问题,则尤其需要这样做。
- 成本优化:通过减少虚拟机大小或节点数量来缩减节点池有助于优化成本,尤其是在集群持续利用率不足或资源需求减少的情况下。
- 应用程序扩展:随着应用程序工作负载的增长,您可能需要通过添加更大的虚拟机或其他节点来扩展 AKS 集群,以满足不断增长的需求并保持性能水平。
- 资源需求:如果应用程序的资源需求发生变化,则可能需要更改节点池大小。
- 工作负载变化:如果您的应用程序工作负载波动,您可能需要考虑使用 Kubernetes 水平 Pod 自动扩缩器 (HPA) 或 Azure Kubernetes 服务 (AKS) 集群自动扩缩器等工具自动调整节点池大小。这些工具会根据工作负载需求自动调整节点数量,从而确保资源分配优化。
调整 AKS 集群 NodePool 大小的步骤
步骤 1:使用所需的 SKU 创建新的节点池
为了将现有节点池(假设名为“nodepool1”)的大小从 SKU Standard_DS2_v2 调整为 Standard_DS3_v2,我们需要使用 Standard_DS3_v2 SKU 创建一个新的节点池(假设名为“mynodepool”)。
az aks nodepool add \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name mynodepool \ --node-count 3 \ --node-vm-size Standard_DS3_v2 \ --mode System \ --no-wait
注意:每个 AKS 集群至少需要有一个系统节点池,且每个节点池至少包含一个节点。在给定场景中,“—mode”参数设置为“System”,因为假设集群只有一个节点池,需要用系统节点池来替换它。请注意,节点池的模式可以根据需要随时修改。
步骤 2:封锁现有节点池
封锁是指将特定节点指定为不可调度的过程,从而有效地阻止任何其他 Pod 被调度到这些节点上。
首先,使用命令“kubectl get nodes”获取要封锁的节点的名称。输出将类似于以下格式:
NAME STATUS ROLES AGE VERSION
aks-nodepool1-31721111-vmss000000 Ready agent 1d08h v1.31.7
aks-nodepool1-31721111-vmss000001 Ready agent 1d08h v1.31.7
aks-nodepool1-31721111-vmss000002 Ready agent 1d08h v1.31.7
随后,使用“kubectl cordon <node-names>”命令指定所需的节点,并以空格分隔的列表形式提供它们的名称。
kubectl cordon aks-nodepool1-31721111-vmss000000 aks-nodepool1-31721111-vmss000001 aks-nodepool1-31721111-vmss000002
Outputnode/aks-nodepool1-31721111-vmss000000 cordoned
node/aks-nodepool1-31721111-vmss000001 cordoned
node/aks-nodepool1-31721111-vmss000002 cordoned
节点池现已隔离,其他 Pod 将不会被重新调度到这些节点池上。
步骤 3:清空现有节点池
清空节点会导致这些节点上运行的 Pod 被驱逐,并在其他可调度节点(本例中为 mynodepool)上重新创建。要清空节点,请使用命令“kubectl drain <node-names> — ignore-daemonsets — delete-emptydir-data”,并使用以空格分隔的节点名称列表。
注意
需要使用 --delete-emptydir-data 参数来驱逐 AKS 创建的 coredns 和 metrics-server Pod。如果不使用此参数,则会出现错误。
kubectl drain aks-nodepool1-31721111-vmss000000 aks-nodepool1-31721111-vmss000001 aks-nodepool1-31721111-vmss000002 --ignore-daemonsets --delete-emptydir-data
排空操作完成后,除守护进程集控制的 Pod 外,所有 Pod 都将在新的节点池上运行。
步骤 4:监控和验证
- 监控节点池调整操作的状态。您可以使用 Azure 门户和 Azure CLI 检查进度。
- 验证 AKS 集群中的节点是否已调整为目标虚拟机大小。
- 确保在节点调整操作后,AKS 集群中运行的应用程序和工作负载正常运行。
- 监控应用程序的性能和资源利用率,以验证它们是否以最佳状态运行。
总结
为了优化 Kubernetes 中的节点池,可以考虑将Artifact Streaming与 Azure 容器注册表 (ACR) 结合使用,以加快镜像拉取速度并缩短部署时间。为经济高效的非关键工作负载实施spot节点池,同时部署自动缩放功能以根据需求调整节点数量。通过为不同的工作负载选择合适的虚拟机大小来自定义节点池配置,并设置资源配额和限制,以确保公平的资源分配。利用节点亲和性和污点/容忍度来控制 Pod 调度,并通过定期监控和更新来保持一致的性能。这些策略共同增强了 Kubernetes 环境中的可扩展性、成本效益和应用程序性能。
相关文章:
最大化效率和性能:AKS 中节点池的强大功能
什么是节点池 在 Azure Kubernetes 服务 (AKS) 中,相同配置的节点会被分组到节点池中。这些节点池包含运行应用程序的底层虚拟机。创建 AKS 集群时,您需要定义初始节点数及其大小 (SKU)。随着应用程序需求的变化,您可能需要更改节点池的设置…...
用户态到内核态:Linux信号传递的九重门(一)
1. 信号的认识 1.1. 信号的特点 异步通知:信号是异步的,发送信号的进程无需等待接收进程的响应。预定义事件:每个信号对应一个预定义的事件(如终止、中断、段错误等)。 轻量级:信号不携带大量数据…...
c语言第一个小游戏:贪吃蛇小游戏01
hello啊大家好 今天我们用一个小游戏来增强我们的c语言! 那就是贪吃蛇 为什么要做一个贪吃蛇小游戏呢? 因为这个小游戏所涉及到的知识有c语言的指针、数组、链表、函数等等可以让我们通过这个游戏来巩固c语言,进一步认识c语言。 一.我们先…...
JAVA EE_网络原理_网络层
晨雾散尽,花影清晰。 ----------陳長生. ❀主页:陳長生.-CSDN博客❀ 📕上一篇:数据库Mysql_联…...
前端性能指标及优化策略——从加载、渲染和交互阶段分别解读详解并以Webpack+Vue项目为例进行解读
按照加载阶段、渲染阶段和交互阶段三个维度进行系统性阐述: 在现代 Web 开发中,性能不再是锦上添花,而是决定用户体验与业务成败的关键因素。为了全面监控与优化网页性能,我们可以将性能指标划分为加载阶段、渲染阶段、和交互阶段…...
Flink 系列之十五 - 高级概念 - 窗口
之前做过数据平台,对于实时数据采集,使用了Flink。现在想想,在数据开发平台中,Flink的身影几乎无处不在,由于之前是边用边学,总体有点混乱,借此空隙,整理一下Flink的内容,…...
控制台打印带格式内容
1. 场景 很多软件会在控制台打印带颜色和格式的文字,需要使用转义符实现这个功能。 2. 详细说明 2.1.转义符说明 样式开始:\033[参数1;参数2;参数3m 可以多个参数叠加,若同一类型的参数(如字体颜色)设置了多个&…...
Linux为啥会重新设置中断请求号与中断向量号之间的关系?
Linux内核重新设置中断请求号(IRQ)与中断向量号之间的关系,主要出于以下核心原因和设计考量: 1. 硬件多样性与抽象需求 硬件中断号(HW Interrupt ID)的差异 不同处理器架构的中断控制器(…...
自然语言处理NLP中的连续词袋(Continuous bag of words,CBOW)方法、优势、作用和程序举例
自然语言处理NLP中的连续词袋(Continuous bag of words,CBOW)方法、优势、作用和程序举例 目录 自然语言处理NLP中的连续词袋(Continuous bag of words,CBOW)方法、优势、作用和程序举例一、连续词袋( Cont…...
计算机网络笔记(二十二)——4.4网际控制报文协议ICMP
4.4.1ICMP报文的种类 ICMP(Internet Control Message Protocol)是IP协议的辅助协议,主要用于传递控制消息、错误报告和诊断信息。其报文分为两大类:查询报文和错误报告报文。 1. 错误报告报文(Error Messages&#x…...
【AI论文】作为评判者的感知代理:评估大型语言模型中的高阶社会认知
摘要:评估大型语言模型(LLM)对人类的理解程度,而不仅仅是文本,仍然是一个开放的挑战。 为了弥合这一差距,我们引入了Sentient Agent作为评判者(SAGE),这是一个自动评估框…...
Kubernetes生产实战(二十七):精准追踪Pod数据存储位置
在生产环境中,快速定位Pod数据的物理存储位置是运维人员的基本功。本文将揭秘Kubernetes存储系统的核心原理,并提供一套经过实战检验的定位方法体系。 一、存储架构全景图 K8S存储架构 Pod --> Volume Mount --> PVC --> PV --> Storage P…...
极新携手火山引擎,共探AI时代生态共建的破局点与增长引擎
在生成式AI与行业大模型的双重驱动下,人工智能正以前所未有的速度重构互联网产业生态。从内容创作、用户交互到商业决策,AI技术渗透至产品研发、运营的全链条,推动效率跃升与创新模式变革。然而,面对AI技术迭代的爆发期࿰…...
[SIGPIPE 错误] 一个 Linux socket 程序,没有任何报错打印直接退出程序
1. 问题 在编写一个程序的时候,当然程序很复杂,遇到了一个 Linux socket 程序,没有任何报错打印直接退出程序,但是在程序里面我有很多 error log ,在程序退出的时候完全没有打印。为了说明问题,我编写了一…...
Qt 界面优化(绘图)
目录 1. 绘图基本概念2. 绘制各种形状2.1 绘制线段2.2 绘制矩形2.3 绘制圆形2.4 绘制文本2.5 设置画笔2.6 设置画刷 3. 绘制图片3.1 绘制简单图片3.2 平移图片3.3 缩放图片3.4 旋转图片 4. 其他设置4.1 移动画家位置4.2 保存/加载画家的状态 5. 特殊的绘图设备5.1 QPixmap5.2 Q…...
AQS(AbstractQueuedSynchronizer)解析
文章目录 一、AQS简介二、核心设计思想2.1 核心设计思想回顾2.2 CLH锁队列简介2.3 AQS对CLH队列的改动及其原因 三、核心组件详解3.1 state 状态变量3.2 同步队列 (FIFO双向链表) 四、核心方法深度解析4.1 获取同步状态 (独占模式) - acquire(int arg)4.2 释放同步状态 (独占模…...
Java并发编程常见问题与陷阱解析
引言 随着计算机硬件技术的飞速发展,多核处理器已经变得普遍,Java并发编程的重要性也日益凸显。然而,多线程编程并非易事,其中充满了许多潜在的问题和陷阱。作为一名Java开发工程师,掌握并发编程的常见问题及其解决方案…...
DEEPPOLAR:通过深度学习发明非线性大核极坐标码(1)
原文:《DEEPPOLAR: Inventing Nonlinear Large-Kernel Polar Codes via Deep Learning》 摘要 信道编码设计的进步是由人类的创造力推动的,而且恰如其分地说,这种进步是零星的。极性码是在Arikan极化核的基础上开发的,代表了编码…...
Java多态详解
Java多态详解 什么是多态? 比如我们说:“驾驶一辆车”,有人开的是自行车,有人开的是摩托车,有人开的是汽车。虽然我们都说“开车”,但“怎么开”是由具体的车类型决定的:“开”是统一的动作&a…...
go程序编译成动态库,使用c进行调用
以下是使用 Go 语言打包成 .so 库并使用 C 语言调用的完整步骤: 1. Go 语言打包成 .so 库 (1)编写 Go 代码 创建一个 Go 文件(如 calculator.go),并定义需要导出的函数。导出的函数名必须以大写字母开头…...
iVX:图形化编程与组件化的强强联合
在数字化浪潮中,软件开发范式正经历着从文本到图形的革命性转变。iVX 作为国产可视化编程领域的领军者,以 “图形化逻辑 组件化架构” 的双重创新,重新定义了软件开发的效率边界。其技术突破不仅体现在开发方式的革新,更通过一系…...
华为配置篇-RSTP/MSTP实验
MSTP 一、简介二、常用命令总结三、实验 一、简介 RSTP(快速生成树协议) RSTP(Rapid Spanning Tree Protocol)是 STP 的改进版本,基于 IEEE 802.1w 标准,核心目标是解决传统 STP 收敛速度慢的问…...
端口号被占用怎么解决
windows环境下端口号被占用怎么解决 win r 快捷键打开cmd输入netstat -ano|findstr 端口号 通过这个命令找到pidtaskkill /pid pid端口号 /t /f 如下图所示 命令解读 netstat 是一个网络统计工具,它可以显示协议统计信息和当前的TCP/IP网络连接。 -a 参数告诉 nets…...
GO语言-导入自定义包
文章目录 1. 项目目录结构2. 创建自定义包3. 初始化模块4. 导入自定义包5. 相对路径导入 在Go语言中导入自定义包需要遵循一定的目录结构和导入规则。以下是详细指南(包含两种方式): 1. 项目目录结构 方法1:适用于Go 1.11 &#…...
ES常识5:主分词器、子字段分词器
文章目录 一、主分词器:最基础的文本处理单元主分词器的作用典型主分词器示例 二、其他类型的分词器:解决主分词器的局限性1. 子字段分词器(Multi-fields)2. 搜索分词器(Search Analyzer)3. 自定义分词器&a…...
NoSQL数据库技术与应用复习总结【看到最后】
第1章 初识NoSQL 1.1 大数据时代对数据存储的挑战 1.高并发读写需求 2.高效率存储与访问需求 3.高扩展性 1.2 认识NoSQL NoSQL--非关系型、分布式、不提供ACID的数据库设计模式 NoSQL特点 1.易扩展 2.高性能 3.灵活的数据模型 4.高可用 NoSQL拥有一个共同的特点&am…...
单片机-STM32部分:12、I2C
飞书文档https://x509p6c8to.feishu.cn/wiki/MsB7wLebki07eUkAZ1ec12W3nsh 一、简介 IIC协议,又称I2C协议,是由PHILP公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备,IIC属于半双工同步通信方式。 IIC是一种同步…...
【英语笔记(四)】诠释所有16种英语时态,介绍每种时态下的动词变形!!含有所有时态的的动词变形汇总表格
1 时态的单词构成 1.1 现在 1.1.1 一般现在时态 动词原形动词原形s(第三人称单数) 1.1.1.1 表达事实 I eat carrots. 我吃胡萝卜:我是吃胡萝卜这种食物的.(这个是事实陈述) The rabbit eats carrots. 兔子吃胡萝卜…...
【质量管理】什么是过程?
在文章【质量管理】谁是顾客?什么是质量链?-CSDN博客 中我们了解了什么是顾客,顾客不仅仅是企业以外的人,在企业的内部我们也有大大小小的顾客。并且我们了解了什么是质量链,企业内部的各种供给方和客户形成了质量链。…...
效率办公新工具:PDF Reader Pro V5.0功能解析与使用体验
在日常文档处理与数字办公的场景中,PDF 文件依然是主流格式之一。从合同审批、项目文档、财务报表,到技术方案和用户手册,PDF 的编辑、转换、标注、归档需求始终存在。 面对这些需求,越来越多用户希望有一款功能完整、跨平台、智…...
Java对象内存布局和对象头
1、面试题 1)说下JUC,AQS的大致流程 CAS自旋锁,是获取不到锁就一直自旋吗? 2)CAS和synchronized区别在哪里,为什么CAS好,具体优势在哪里? 3)sychro…...
Vue 跨域解决方案及其原理剖析
在现代 Web 开发中,跨域问题是前端开发者经常面临的挑战之一。当使用 Vue.js 构建应用时,跨域请求的处理尤为重要。本文将深入探讨 Vue 解决跨域的多种方法及其背后的原理,帮助开发者更好地理解和应对这一常见问题。 一、跨域问题概述 1. 同…...
TikTok 互动运营干货:AI 助力提升粘性
在 TikTok 运营的众多环节中,与用户的互动是建立紧密联系、提升账号粘性的关键所在。及时且真诚地回复评论和私信,能让用户切实感受到你的关注与尊重,从而极大地增强他们对你的好感与粘性。对于用户提出的问题,要以耐心、专业的态…...
Kids A-Z安卓版:儿童英语启蒙的优质选择
Kids A-Z安卓版 是一款由北美知名分级读物厂商 Learning A-Z 官方推出的英语分级学习应用,也被称为 Raz-Kids app。它专为 K-5 年级的学生设计,提供丰富的英语学习资源和互动学习体验,帮助孩子们在轻松愉快的环境中提升英语能力。通过动画、互…...
接口继承与扩展的使用技巧
在 TypeScript 中,接口继承和扩展是非常强大且灵活的功能,可以帮助我们更高效地管理类型和提高代码的可重用性。接口继承使得一个接口可以从另一个接口继承属性和方法,而接口扩展允许我们通过组合多个接口来构建更复杂的结构。这些特性使得 T…...
【React】Craco 简介
Craco 简介 Craco (Create React App Configuration Override) 是一个用于自定义 Create React App (CRA) 配置的工具,无需 eject(弹出)项目。 为什么需要 Craco Create React App 虽然提供了零配置的 React 开发体验,但其配置…...
HTML5中的Microdata与历史记录管理详解
Microdata 简介 Microdata 是 HTML5 引入的一种标记方式,用于在网页中嵌入机器可读的语义信息。通过使用 Microdata,开发者可以在 HTML 元素中添加特定的属性,以便搜索引擎和其他工具更好地理解网页内容。 Microdata 的核心属性包括 itemsc…...
UNet网络 图像分割模型学习
UNet 由Ronneberger等人于2015年提出,专门针对医学图像分割任务,解决了早期卷积网络在小样本数据下的效率问题和细节丢失难题。 一 核心创新 1.1对称编码器-解码器结构 实现上下文信息与高分辨率细节的双向融合 如图所示:编码器进行了4步&…...
Babel 深度解析:现代 JavaScript 开发的桥梁
1. 什么是 Babel? Babel 是一个 JavaScript 编译器(又称转译器),核心使命是解决 JavaScript 的环境兼容性问题。它允许开发者使用最新的语言特性(如 ES6、JSX、TypeScript),同时将代码转换为旧…...
MyBatis源码解读2(2.1、核心对象)
二、MyBatis的核心对象 2.1、核心对象 2.1、MappedStatement MyBatis其实是对JDBC的进一步封装,我们都知道JDBC有几个重要的对象: StatementPrepared StatementCallable StatementResultSet Statement、Prepared Statement、Callable Statement分别…...
03.three官方示例+编辑器+AI快速学习webgl_animation_multiple
本实例主要讲解内容 这个示例展示了Three.js中骨骼动画的高级应用技巧,重点演示了如何使用SkeletonUtils.clone()方法复制模型,并展示了两种不同的骨骼动画管理方式: 独立骨骼模式:每个模型拥有独立的骨骼结构,可播放…...
无锁秒杀系统设计:基于Java的高效实现
引言 在电商促销活动中,秒杀场景是非常常见的。为了确保高并发下的数据一致性、性能以及用户体验,本文将介绍几种不依赖 Redis 实现的无锁秒杀方案,并提供简化后的 Java 代码示例和架构图。 一、基于数据库乐观锁机制 ✅ 实现思路…...
MyBatis快速入门——实操
默认:电脑搭建好了Maven环境 本次入门实验使用的idea版本:ideaU2022.1 目录 一:前期准备工作 1. 创建一个springboot工程 2. Maven环境配置 3. 在mysql数据库中创建一个user表 4. 编写实体类User 二: 引入MyBatis的相关依赖…...
假如你的项目是springboot+vue怎么解决跨域问题
1. 前端代理(开发环境推荐) 适用场景:Vue 开发环境调试时,避免直接请求后端接口的跨域问题。 实现步骤: 在 Vue 项目的 vue.config.js 中配置代理: module.exports {devServer: {proxy: {/api: { // 代理…...
OpenResty反向代理
通过在 OpenResty 的配置文件中定义不同的 location 块,将匹配特定 URL 路径的请求转发到不同的后端 FastAPI 应用(即使它们运行在不同的端口或甚至是不同的服务器/容器上)。 核心思路: 多个 FastAPI 应用实例: 你的每…...
《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式(Conditional Expressions)
《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式(Conditional Expressions) 在 Python 中,条件表达式(conditional expressions)提供了一种简洁的方式来在一行中实现 if/else 的逻辑。它…...
【Typenum】 3 类型位运算(bit.rs)
一、源码 代码定义了一个类型级别的位(bit)系统,主要用于编译时的类型运算。 //! 类型级比特位实现 //! //! 这些是基础的比特位类型,作为本库中其他数值类型的构建基础 //! //! 已实现的**类型运算符**: //! //! - …...
python:trimesh 用于 STL 文件解析和 3D 操作
python:trimesh 是一个用于处理三维模型的库,支持多种格式的导入导出,比如STL、OBJ等,还包含网格操作、几何计算等功能。 Python Trimesh 库使用指南 安装依赖库 pip install trimesh Downloading trimesh-4.6.8-py3-none-any.w…...
stm32week15
stm32学习 十一.中断 2.NVIC Nested vectored interrupt controller,嵌套向量中断控制器,属于内核(M3/4/7) 中断向量表:定义一块固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址,中断向量表定…...
数据库分库分表实战指南:从原理到落地
1. 为什么要分库分表? 1.1 单库瓶颈表现 存储瓶颈:单表数据超过5000万行,查询性能急剧下降性能瓶颈:单库QPS超过5000后响应延迟显著增加可用性风险:单点故障导致全系统不可用 1.2 突破性优势 --------------------…...