Apache Kafka 消息清理之道
前言
消息的清理是 MQ 中间件的基本能力,可以避免 MQ 的存储占用空间无序增长。与其他消息产品不同,Apache Kafka(以下简称 Kafka) 中 topic 上的消息被消费后不会被马上清除,而是由 topic 级别的清理策略来控制。本文将简要介绍 Kafka 中的两种消息清理策略:deletion 和 compaction,探讨他们的应用场景、配置参数以及一些技术细节。
AutoMQ[1] 是与 Apache Kafka 100% 兼容的新一代云原生 Kafka,对 Kafkfa 的存储层进行了重新设计和实现,使得其可以构建在像S3这样的对象存储之上。 得益于 AutoMQ 对 Apache Kafka 的完全兼容,本文中提到的原理和参数对于 AutoMQ 也同样适用。
名词定义
-
消息:Kafka 官方一般称为 event 或 record。一个 event 包含一个 key(可选)和一个 value(消息本体);
-
消息 batch:Kafka 会将多个消息聚合为一个 batch。具体来说,client 以 batch 形式向服务端生产或消费消息,服务端也按照 batch 进行消息的存储;
-
topic partition: topic 的一个分区。Kafka 中一个 topic 会被划分为多个 topic partition,以支持消费端和服务端的负载均衡;
-
segment:Kafka 中消息在存储介质上的基本单位。一个 topic partition 会被划分为多个 segment。它也是消息清理的基本单位;
Deletion or Compaction
我们可以在 Kafka 中为 topic 配置“cleanup.policy”参数,以指定它的清理策略。可选项包括:
-
delete:默认策略,当 segment 的大小或者时间达到阈值后直接删除;
-
compact:基于 key 的压缩策略,绑定同一个 key 的多个消息将仅保留最新的那个消息,其他消息将被删除。Kafka 的内部 topic “__consumer_offsets” 就是 compact 策略。
-
delete + compact:混合策略,老的 segment 会因为大小或时间被删除,同时 topic partition 也会被 compact;
一般来说,如果你的业务关注的是 key 的终态 value(也就是 KV 之类的场景),例如记录用户每日的行走步数,或者账户的余额,那么 compact 比较适合[2]。此外,compact 策略下,业务的 key 最好是可枚举的少数值。key 取值过于分散将会导致 compaction 效果大打折扣,这种场景可以考虑采用 delete + compact 的策略。如果没有明显的 KV 特征,一般采用 delete 策略即可。
注:Kafka 支持修改 topic 的清理策略,无需重启。
清理涉及的线程
Kafka 中以下线程会执行清理逻辑:
-
Scheduler 线程:执行 “kafka-log-retention” 任务,定时检查纯 delete 策略的 topic 是否需要清理;
-
LogCleaner 持有的 N 个 CleanerThread:执行 log compaction,同时执行 “delete + compact”混合策略下相关 topic 的 deletion;
其中 LogCleaner 需要将 server 侧的“log.cleaner.enable”配置为 true 才会开启(从 0.9.0.1 版本开始默认即为 true)。
以下将分别讨论这两类清理动作的细节。
Scheduler 触发的清理
Scheduler 定期执行执行 “kafka-log-retention” 任务,在该任务中将基于时间或者大小触发相关 segment 的删除。
涉及参数
-
log.retention.hours:Kafka 中消息保留的时间,默认取值为 168,也就是保留一个星期。前文提到过,清理的基本粒度是 segment,因此,只有在 segment 中最新的消息都超过了保留时间时,整个 segment 才会被删除;类似的其他时间粒度的参数还有 log.retention.minutes、log.retention.ms;
-
log.retention.bytes:topic partition 中最多保留的消息大小,默认取值 -1,也就是不做大小限制;
-
log.retention.check.interval.ms:“kafka-log-retention” 任务的执行间隔,默认取值 300000,即 5 min;
清理流程
-
过滤纯 delete 策略的 topic partition;
-
调用 kafka.log.UnifiedLog#deleteOldSegments(),清理三类 segment:
-
deleteLogStartOffsetBreachedSegments:删除 baseOffset <= logStartOffset 的 segment;
-
deleteRetentionSizeBreachedSegments:基于大小删除多余的 segment;
-
deleteRetentionMsBreachedSegments:基于时间删除过期的 segment;
-
LogCleaner 触发的清理
LogCleaner 是为了支持 compaction 而引入的组件,由“log.cleaner.enable”控制开启。LogCleaner 持有多个 CleanerThread,每个线程相对独立,基于 key 清理过时的消息。
compaction 策略下消息也可以被“删除”。如果 key 最新的 value 为 null,则 server 侧会将其视为删除的“声明”,并将在墓碑过期(见后文)后彻底删除该 key。
关于 compaction,Kafka 可以提供如下保障[3]:
-
追尾读的 consumer 可以消费到所有生产者写入的消息,这些消息有着连续的 offset;
-
消息的顺序不会变更,compaction 只是移除部分消息;
-
消息的 offset 不会变化,offset 一旦产生就是持久化的;
-
从头开始消费的 consumer 至少可以消费到终态的 value;
最后一条代表两个含义:
-
最新的 value 一定会保存(除非是 null 值);
-
有可能消费到 key 对应的早期的 value,原因可能是还没达到 compaction 的条件,也可能是相关消息带有墓碑标记(见后文)暂未删除;
涉及参数
除了上文的“log.cleaner.enable”,较为重要的配置还有:
-
log.cleaner.min.compaction.lag.ms:参与 compaction 的消息需要满足的最小生存时间,可以避免较新的消息参与 compaction。默认值 0;
-
log.cleaner.max.compaction.lag.ms:触发 compaction 满足的生存时间阈值,主要为了让不活跃的 topic partition 也能参与到 compaction。默认值 9223372036854775807,即不开启本特性;
-
log.cleaner.min.cleanable.ratio:topic partition 的 dirty 比例,超过阈值才有可能参与 compaction。更低的值意味着更高的清理频率。默认值 0.5;
-
delete.retention.ms:带有墓碑标记的消息的“死缓”时间。默认值 86400000,即一天;
-
log.cleaner.threads:LogCleaner 持有的 CleanerThread 数目。默认值为 1;
-
log.cleaner.backoff.ms:CleanerThread 没有扫描到可 compaction 的 topic partition 后的静默时间。默认值 15000(15s);
清理流程
在开始之前,先介绍几个概念:
-
active segment: 当前活跃的 segment,也是最新的 segment,可以接受新消息的写入;
-
cleaned segments:此前 compaction 的产物,这些 segments 中的所有消息,不存在重复的 key;
-
dirty segments:cleaned segments 之后,active segment 之前的 segment。这些 segment 没有经历过 compaction。
大体可以分为:
-
待 compact 的 topic partition 的筛选;
-
topic partition 的 compaction;
-
配置了“delete + compact”混合策略的 topic partition 执行 deletion;
Topic Partition 的筛选
本阶段,将从 server 端筛选出最“脏”的 topic partition。具体来说,Kafka 会过滤出以下 topic partition 作为候选 者:
-
存在 dirty 消息,但是不活跃的 topic partition,避免它们长期不被清理;
-
活跃的,并超过了清理阈值的 topic partition;
大体逻辑如下:
其中:
-
inProgress lock: 用于线程之间的锁定,防止一个 topic partition 被多个 CleanerThread 选中,同时防止 topic partition 在清理策略变更时被 Scheduler 线程和 CleanerThread 同时选中;
-
partition uncleanable: 表示线程清理过程中发生过预期外的异常(非 ThreadShutdownException 或 ControlThrowable),将这些 partition “拉黑”;
-
firstDirtyOffset: 一般从 checkpoint 文件中读取,值为上次清理的最后位点 + 1;
-
firstUncleanalbeDirtyOffset: 不可清理的起始位点,取值为 min{log.lastStableOffset, log.activeSegment.baseOffset, 不满足 minCompactionLagMs 的 segment.baseOffset};
-
needCompactionNow:取值为 (now - min(dirty segment 的 FirstBatchTimestamp)) > maxCompactionLagMs。为 true 往往意味着这个 topic partition 太久没有被命中了;
-
取 max 值: 实际上就是取 dirty ratio 最高的 topic partition,一个 CleanerThread 一次仅对一个 topic partition 做 compaction;
-
dirty ratio = ([firstDirtyOffset, firstUncleanalbeDirtyOffset) 之间消息的大小)/([startOffset, firstUncleanalbeDirtyOffset) 之间消息的大小);
Partition 的 compaction
本阶段将构建 offsetMap,其中 key 为消息的 key,value 为绑定该 key 的最新消息的 offset。并根据该 map,分批构建新 segment。大致流程如下:
首先,在 [firstDirtyOffset, firstUncleanalbeDirtyOffset) 区间内构建 offsetMap。注意,此 map 不包含任何控制信息以及中断事务的消息。为了避免区间过长导致 map 无限膨胀,offsetMap 大小是受限的(所有 CleanerThread 的 offsetMap 总共的内存占用不可超过 128 MB)。因此,最终 offsetMap 的 latestOffset < firstUncleanalbeDirtyOffset。
接着,在[0, offsetMap.latestOffset] 区间内,将所有待清理的 segment 进行分组,每个 group 中的总的 logSize、indexSize、timeIndexSize 不可以超过相应的 topic config。预期每个 group 对应一个清理后的 segemnt。
之后,基于 offsetMap,为每个 group 中的 segment 中所有的 batch 进行过滤,写入到新 segment 中,不同 batch 中 record 的删除规则为:
-
ControlBatch:空 batch 或者空事务对应的 ControlBatch(事务数据在此前已经删除完毕),且墓碑已超时;
-
dataBatch:满足以下条件中的一个:
-
中断事务中的消息;
-
record.offset() < offsetMap.get(key) 或者 (value 为 null,且墓碑超时);
-
上面提到的墓碑是一种两阶段删除手段,是 Kafka 为了让下游的消费者能够有机会完整地获取所有消息引入的一种机制。也就是说,如果消费者必须在“delete.retention.ms”时间内从头消费到最新位点,才可以完整“回放”所有消息。从效果上来说,墓碑相当于给事务 marker 和 null value 消息判了“死缓”。
需要注意的是,对于 magic 值 >= 2 的新版本 batch,墓碑时间会在第一次 compaction 时打入 batch。对于 magic 值 < 2 的老版本 batch,是依据 segment 的最后修改时间来近似推断是否墓碑超时的。
最后,过滤完毕的 record 写入新 segment。新 segment 上线,老 segment 被删除。将 offsetMap.latestOffset + 1 存入 clean offset checkpoint 文件。
整体来看,compaction 后,log startOffset 会小幅前进,同时原有的消息会进行一定“压缩”:
Segment deletion
与 Scheduler 触发的删除类似,配置了“delete + compact”混合策略后的 topic partition 也会删除旧的 segment,只是删除由 CleanerThread 完成。删除逻辑不再赘述。
总结
本文介绍了 Kafka 中消息的两种清理策略。首先从整体上介绍了 Kafka 中的两种消息清理策略,讨论了业务 topic 清理策略的选择问题。接着简要介绍了清理涉及的线程。最后,分别讨论了 Scheduler 和 LogCleaner 触发的清理的参数和技术细节。对于 delete 策略,会基于 partition size 或者消息过期时间进行 segement 的直接删除;对于 compact 策略,会构建 offset map,并基于该 map 保留同一个 key 对应的最新 value。
参考文献:
[1] AutoMQ: https://www.automq.com
[2] Kafka Topic Configuration: Log Compaction: https://www.conduktor.io/kafka/kafka-topic-configuration-log-compaction/
[3] Compaction guarantees https://docs.confluent.io/kafka/design/log_compaction.html#compaction-guarantees
相关文章:
Apache Kafka 消息清理之道
前言 消息的清理是 MQ 中间件的基本能力,可以避免 MQ 的存储占用空间无序增长。与其他消息产品不同,Apache Kafka(以下简称 Kafka) 中 topic 上的消息被消费后不会被马上清除,而是由 topic 级别的清理策略来控制。本文将简要介绍 Kafka 中的…...
JVM ①-类加载 || 内存区域
这里是Themberfue 终于结束了网络层的学习,当然,我们学习的知识也只是冰山一角,想要了解更多的知识,还请大家养成主动探索的习惯~~~接下来我们将对 JVM 的一些机制进行简单的讲解,对于 Java程序员来说,本身…...
物理信息机器学习(PIML)的基础探讨及技术实现
在传统机器学习方法迅速发展并在图像识别、语音处理、自然语言处理等领域取得显著突破的同时,科学计算、工程设计以及自然系统建模等领域常常面临数据不足、噪声干扰以及模型泛化能力弱的问题。单纯依赖数据驱动的“黑箱”模型在处理物理问题时,往往难以兼顾数据拟合与物理解…...
【浏览器多开】Google Chrome 谷歌浏览器分身术
谷歌浏览器分身术(多开): 复制已有谷歌浏览器图标—>右键–>属性的目标栏中,添加 --user-data-dir自定义文件夹路径 参数。 例如: C:\MySpace\02Installed\Chrome\Chrome-bin\99.0.4844.51\chrome.exe –user-d…...
《量化绿皮书》Chapter 3 Calculus and Linear Algebra 微积分与线性代数(二)
《A Practical Guide To Quantitative Finance Interviews》,被称为量化绿皮书,是经典的量化求职刷题书籍之一,包含以下七章: Chapter 1 General Principles 通用技巧 Chapter 2 Brain Teasers 脑筋急转弯 Chapter 3 Calculus and…...
单片机成长之路(51基础篇) - 008 C51 的标示符和关键字
标准 C 语言定义了 32 个关键字,如下表(ANSI C的32个关键字): C51在此基础上针对单片机功能进行了扩展,详情见下表(C51编译器扩充关键字): C 51的数据类型 51单片机使用的C语言的存储器类型分为以下几种:...
嵌入式AI革命:DeepSeek开源如何终结GPU霸权,开启单片机智能新时代?
2025年,全球AI领域最震撼的突破并非来自算力堆叠的超级模型,而是中国团队DeepSeek通过开源策略,推动大模型向微型化、低功耗场景的跨越。相对于当人们还在讨论千亿参数模型的训练成本被压缩到600万美金而言,被称作“核弹级别”的操…...
Deno vs Node.js:性能对比深度解析
1. 引言 Deno 和 Node.js 都是基于 V8 引擎的 JavaScript 运行时环境,然而它们在架构、模块管理、安全性和性能方面存在显著差异。Deno 由 Node.js 的原始作者 Ryan Dahl 开发,旨在解决 Node.js 设计上的一些问题,比如包管理、安全模型和 Ty…...
【R】Dijkstra算法求最短路径
使用R语言实现Dijkstra算法求最短路径 求点2、3、4、5、6、7到点1的最短距离和路径 1.设置data,存放有向图信息 data中每个点所在的行序号为起始点序号,列为终点序号。 比如:值4的坐标为(1,2)即点1到点2距离为4;值8的坐标为(6,7)…...
网络安全治理架构图 网络安全管理架构
网站安全攻防战 XSS攻击 防御手段: - 消毒。 因为恶意脚本中有一些特殊字符,可以通过转义的方式来进行防范 - HttpOnly 对cookie添加httpOnly属性则脚本不能修改cookie。就能防止恶意脚本篡改cookie 注入攻击 SQL注入攻击需要攻击者对数据库结构有所…...
@emotion/styled / styled-components创建带有样式的 React 组件
一、安装依赖 npm install emotion/styled styled-components 二、使用 import styled from emotion/styled; import styled from styled-components;// 创建一个带样式的按钮 const StyledButton styled.buttonbackground-color: #4caf50;color: white;padding: 10px 20px…...
Gemini 2.0模型更新:谷歌最新AI大模型全面开启智能时代
引言 2025年2月5日,谷歌人工智能实验室(Google DeepMind)发布了最新的Gemini 2.0模型系列更新,包括2.0 Flash、Flash-Lite和Pro实验版本。这些AI大模型的发布标志着人工智能技术在性能、效率和多模态能力上的进一步突破ÿ…...
MySQL 主从复制原理及其工作过程
一、MySQL主从复制原理 MySQL 主从同步是一种数据库复制技术,它通过将主服务器上的数据更改复制到一个或多个从服务器,实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器,并在从服务器上执行这些日志…...
详解在Pytest中忽略测试目录的三种方法
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 你是否曾因无关或过时的代码导致测试失败? 这可能会增加调试和故障排除…...
ZoneMinder index.php存在SQL注入漏洞(CVE-2024-43360)
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
【DeepSeek】DeepSeek概述 | 本地部署deepseek
目录 1 -> 概述 1.1 -> 技术特点 1.2 -> 模型发布 1.3 -> 应用领域 1.4 -> 优势与影响 2 -> 本地部署 2.1 -> 安装ollama 2.2 -> 部署deepseek-r1模型 1 -> 概述 DeepSeek是由中国的深度求索公司开发的一系列人工智能模型,以其…...
webGL
WebGL:3D图形的网络标准 WebGL(Web Graphics Library)是一种3D绘图协议,它允许开发者在不需要任何插件的情况下,在网页浏览器中创建交互式2D和3D效果。WebGL是基于OpenGL ES的JavaScript API,它可以为HTML5…...
电脑远程控制vivo手机,切换按钮就能让vivo仅投屏、不受控制!
Linux系统在全球的市场份额并不高,继而很多便捷的软件都没有Linux的版本。如果想要用Linux远程控制安卓手机,找软件会比较麻烦,但是AirDroid网页版可以做到。 以vivo手机为例子,接下来讲解Linux系统电脑要远程控制安卓手机时&…...
MS17-010(永恒之蓝1.0)漏洞远程控制win7系统操作实战小白通俗易懂
1.准备环境win7操作系统(被攻击机)以及kali系统(攻击机),kali使用msf工具进行攻击。 2.打开kali终端,进入msf,输入msfconsole然后等待启动。 ┌──(root㉿kali-chifan)-[~] └─# msfconsole…...
【Java计算机毕业设计】基于Springboot+Vue社区志愿者管理系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】
源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储:…...
三次握手,四次挥手,服务器模型(多进程并发,线程),基于套接字的UDP通信
三次握手: 第一次握手:客户端向服务器发送SYN待确认数据x, 客户端进入SYN_SEND状态 第二次握手:服务器向客户端回传一条ACK应答数据x1, 同时发送一条SYN待确认数据y,服务器进入SYN_RECV状态 第三次握手:客户端向服…...
通讯录管理小程序
通讯录管理系统 是对c基础语法的巩固,比较简单的一个小程序,重点在于养成良好的c代码习惯。 通讯录是一个可以记录亲人、好友信息的工具。 本教程主要利用C来实现一个通讯录管理系统 下面是一些需要实现的功能: 1. 添加联系人 功能描述&…...
[ESP32:Vscode+PlatformIO]添加第三方库 开源库 与Arduino导入第三方库的区别
前言 PlatformIO与Arduino在添加第三方库方面的原理存在显著差异 在PlatformIO中,第三方库的使用是基于项目(工程)的。具体而言,只有当你为一个特定的项目添加了某个第三方库后,该项目才能使用该库。这些第三方库的文…...
SpringSecurity:授权服务器与客户端应用(入门案例)
文章目录 一、需求概述二、开发授权服务器1、pom依赖2、yml配置3、启动服务端 三、开发客户端应用1、pom依赖2、yml配置3、SecurityConfig4、接口5、测试 一、需求概述 maven需要3.6.0以上版本 二、开发授权服务器 1、pom依赖 <dependency><groupId>org.springfr…...
k8s证书过期怎么更新?
在 Kubernetes 集群中,证书过期可能导致集群不可用,尤其是 API Server、Controller Manager、Scheduler 等组件所使用的证书。为了恢复集群的正常运行,您需要更新这些证书。以下是更新 Kubernetes 证书的基本步骤: 1. 检查证书状…...
【戒抖音系列】短视频戒除-1-对推荐算法进行干扰
如今推荐算法已经渗透到人们生活的方方面面,尤其是抖音等短视频核心就是推荐算法。 【短视频的危害】 1> 会让人变笨,慢慢让人丧失注意力与专注力 2> 让人丧失阅读长文的能力 3> 让人沉浸在一个又一个快感与嗨点当中。当我们刷短视频时&#x…...
VUE 集成企微机器人通知
message-robot 便于线上异常问题及时发现处理,项目中集成企微机器人通知,及时接收问题并处理 企微机器人通知工具类 export class MessageRobotUtil {constructor() {}/*** 发送 markdown 消息* param robotKey 机器人 ID* param title 消息标题* param…...
封装descriptions组件,描述,灵活
效果 1、组件1,dade-descriptions.vue <template><table><tbody><slot></slot></tbody> </table> </template><script> </script><style scoped>table {width: 100%;border-collapse: coll…...
等级保护2.0|网络安全服务
等级保护2.0|网络安全服务 定义 对于国家秘密信息、法人和其他组织及公民专有信息以及公开信息的存储、传输、处理这些信息系统分等级实行安全保护,对信息系统中发生的信息安全时间分等级响应、处置。 思想 对信息安全实行等级化保护和等级化管理 目标 突出重…...
STM32 RTC亚秒
rtc时钟功能实现:rtc模块在stm32内部,由电池或者主电源供电。如下图,需注意实现时仅需设置一次初始化。 1、stm32cubemx 代码生成界面设置,仅需开启时钟源和激活日历功能。 2、生成的代码,需要对时钟进行初始化,仅需…...
H5+CSS+JS制作好看的轮播图
先来看效果 点击下方按钮可以做到平滑切换轮播,轮播图片可以根据自定义随心变化。 先来看一下页面代码结构 <div class"container"><div class"lunbo-wrap"><div id"slide"></div><div class"butto…...
Win10 部署llama Factory 推荐教程和遇到的问题
教程 【大模型微调】使用Llama Factory实现中文llama3微调_哔哩哔哩_bilibili 大模型微调!手把手带你用LLaMA-Factory工具微调Qwen大模型!有手就行,零代码微调任意大语言模型_哔哩哔哩_bilibili 遇到问题解决办法 pytorch gpu国内镜像下载…...
Visual Studio踩过的坑
统计Unity项目代码行数 编辑-查找和替换-在文件中查找 查找内容输入 b*[^:b#/].*$ 勾选“使用正则表达式” 文件类型留空 也有网友做了指定,供参考 !*\bin\*;!*\obj\*;!*\.*\*!*.meta;!*.prefab;!*.unity 打开Unity的项目 注意:只是看࿰…...
idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡
idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡 问题 idea编译器 安装copilot AI工具 实际操作 在 IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤如下: 打开 IntelliJ IDEA: 打开你的 IntelliJ IDEA 应用…...
Leetcode 3449. Maximize the Minimum Game Score
Leetcode 3449. Maximize the Minimum Game Score 1. 解题思路2. 代码实现 题目链接:3449. Maximize the Minimum Game Score 1. 解题思路 这一题思路上就是一个二分法,尝试各个score,看看是否可以满足在给定的m次操作限制下,使…...
DeepSeek深度思考:客户端(Android/iOS)架构设计指南
目标读者:中高级开发者、架构师 适用场景:大型复杂应用开发、跨团队协作、长期维护迭代 一、架构设计核心原则 1.模块化(Modularization) 横向拆分:按功能边界划分(如登录、支付、消息模块)纵向…...
智能理解 PPT 内容,快速生成讲解视频
当我们想根据一版 PPT 制作出相对应的解锁视频时,从撰写解锁词,录制音频到剪辑视频,每一个环节都需要投入大量的时间和精力,本方案将依托于阿里云函数计算 FC 和百炼模型服务,实现从 PPT 到视频的全自动转换࿰…...
HTML 颜色值
HTML 颜色值 引言 在网页设计和开发中,颜色是一个重要的元素,它能够影响用户的视觉体验和网站的视觉效果。HTML 颜色值是网页设计中用来指定文本、背景或其他元素颜色的标准。本文将详细介绍 HTML 颜色值的概念、类型、表示方法以及在实际应用中的注意事项。 HTML 颜色值的…...
kafka消费端之消费者协调器和组协调器
文章目录 概述回顾历史老版本获取消费者变更老版本存在的问题 消费者协调器和组协调器新版如何解决老版本问题再均衡过程**第一阶段CFIND COORDINATOR****第二阶段(JOINGROUP)**选举消费组的lcader选举分区分配策略 第三阶段(SYNC GROUP&…...
【C++】解锁<list>的正确姿势
> 🍃 本系列为初阶C的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:[小编的个人主页])小编的个人主页 > 🎀 🎉欢迎大家点赞👍收藏⭐文章 > ✌️ 🤞 …...
【玩转全栈】----Django模板的继承
先赞后看,养成习惯!!! 目录 模板继承的好处 模板继承的语法规则 更新代码 上文中的部门管理页面: 【玩转全栈】----Django制作部门管理页面-CSDN博客 大家会发现,由于定义了多个html文件,多个ht…...
【紫光同创PG2L100H开发板】盘古676系列,盘古100Pro+开发板,MES2L676-100HP
本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com) 一:开发系统介绍 开发系统概述 MES2L676-100HP开发板采用紫光创 logos2系列 FPGA,型号&#x…...
Mac下使用brew安装go 以及遇到的问题
首先按照网上找到的命令进行安装 brew install go 打开终端输入go version,查看安装的go版本 go version 配置环境变量 查看go的环境变量配置: go env 事实上安装好后的go已经可以使用了。 在home/go下新建src/hello目录,在该目录中新建…...
活动预告 |【Part 2】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁
课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动,了解如何更好地在 Microsoft 365 Defen…...
android的DataBinding简介
Android DataBinding 简介 DataBinding 是 Android Jetpack 中的数据绑定库,用于将 UI 组件直接与数据模型绑定,减少模板代码并实现双向数据同步。它通过声明式布局简化 UI 更新逻辑,常用于 MVVM(Model-View-ViewModel࿰…...
基于DeepSeek API和VSCode的自动化网页生成流程
1.创建API key 访问官网DeepSeek ,点击API开放平台。 在开放平台界面左侧点击API keys,进入API keys管理界面,点击创建API key按钮创建API key,名称自定义。 2.下载并安装配置编辑器VSCode 官网Visual Studio Code - Code Editing…...
【DeepSeek】私有化本地部署图文(Win+Mac)
目录 一、DeepSeek本地部署【Windows】 1、安装Ollama 2、配置环境变量 3、下载模型 4、使用示例 a、直接访问 b、chatbox网页访问 二、DeepSeek本地部署【Mac】 1、安装Ollama 2、配置环境变量 3、下载模型 4、使用示例 5、删除已下载的模型 三、DeepSeek其他 …...
vscode预览插件
在左侧列表拓展里搜索 Live Preview 安装,然后在html页面点击右键找到show Preview 结果如下图 然后就可以进行代码开发并实时预览了...
迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-编写应用APP
在应用代码中我们实现如下功能: 当应用程序启动后会获取命令行参数。如果命令行没有参数,LED 灯将循环闪烁;如果命令行带有参数,则根据传输的参数控制 LED 灯的开启或关闭。通过 HdfIoServiceBind 绑定 LED灯的 HDF 服务ÿ…...
在大型语言模型(LLM)框架内Transformer架构与混合专家(MoE)策略的概念整合
文章目录 传统的神经网络框架存在的问题一. Transformer架构综述1.1 transformer的输入1.1.1 词向量1.1.2 位置编码(Positional Encoding)1.1.3 编码器与解码器结构1.1.4 多头自注意力机制 二.Transformer分步详解2.1 传统词向量存在的问题2.2 详解编解码…...