中国邮政Java面试被问:Kafka的Log Compaction实现和删除策略

一、Log Compaction核心概念

1.什么是Log Compaction?

图表

代码

复制

下载

全屏

graph TB A[原始Log] --> B[Key-Value消息流] B --> C{Log Compaction} C --> D[保留每个Key的最新值] C --> E[删除过期旧值] D --> F[压缩后的Log] subgraph "消息示例" G[key=A, value=1, offset=0] H[key=B, value=2, offset=1] I[key=A, value=3, offset=2] J[key=C, value=4, offset=3] K[key=A, value=5, offset=4] end subgraph "压缩后" L[key=B, value=2] M[key=C, value=4] N[key=A, value=5] end

二、Log Compaction实现机制

1.核心数据结构

java

复制

下载

public class LogCleaner implements Runnable { // Cleaner状态管理 private final Map<TopicPartition, LogCleanerStats> cleanerStats = new ConcurrentHashMap<>(); private final Map<TopicPartition, CleanerCheckpoint> checkpoints = new ConcurrentHashMap<>(); // 压缩任务队列 private final BlockingQueue<CleanerTask> taskQueue = new LinkedBlockingQueue<>(); // 压缩配置 private final long maxMessageSize; private final double maxIoBytesPerSecond; private final int numThreads; public class CleanerTask { private final TopicPartition topicPartition; private final long startOffset; // 压缩起始偏移量 private final long endOffset; // 压缩结束偏移量 private final NavigableMap<Long, Segment> segments; // 压缩执行 public void compact() { try { // 1. 构建OffsetMap OffsetMap offsetMap = buildOffsetMap(); // 2. 读取脏段(Dirty Segments) List<Segment> dirtySegments = selectDirtySegments(); // 3. 执行压缩 List<Segment> cleanedSegments = doClean(dirtySegments, offsetMap); // 4. 替换旧段 replaceSegments(dirtySegments, cleanedSegments); // 5. 更新检查点 updateCheckpoint(); } catch (Exception e) { logger.error("Clean failed for {}", topicPartition, e); } } } }

2.压缩算法实现

java

复制

下载

public class LogCleaner { /** * 构建OffsetMap - 记录每个Key的最新偏移量 */ private OffsetMap buildOffsetMap(LogSegment headSegment, long startOffset) { OffsetMap offsetMap = new SkimpyOffsetMap(memory); // 从head段开始扫描,找到每个key的最新位置 for (RecordBatch batch : headSegment.batchesFrom(startOffset)) { for (Record record : batch) { if (record.hasKey()) { // 使用hash存储key到最新offset的映射 long offset = batch.baseOffset() + record.offsetDelta(); offsetMap.put(record.key(), offset); } } } return offsetMap; } /** * 执行压缩清理 */ private List<LogSegment> doClean(List<LogSegment> dirtySegments, OffsetMap offsetMap) throws IOException { List<LogSegment> cleanedSegments = new ArrayList<>(); LogSegment currentCleaned = null; // 按偏移量顺序处理脏段 for (LogSegment dirtySegment : dirtySegments) { // 读取脏段中的所有记录 for (RecordBatch batch : dirtySegment.batches()) { for (Record record : batch) { if (!record.hasKey()) { // 没有key的消息直接保留 currentCleaned.append(record); continue; } long lastOffset = offsetMap.get(record.key()); long currentOffset = batch.baseOffset() + record.offsetDelta(); if (lastOffset == -1) { // Key第一次出现,保留 offsetMap.put(record.key(), currentOffset); currentCleaned.append(record); } else if (currentOffset >= lastOffset) { // 这是该Key的最新版本 offsetMap.put(record.key(), currentOffset); currentCleaned.append(record); } else { // 这是旧版本,跳过 cleanerStats.skippedRecords().increment(); } } } // 当前清理段达到大小限制,创建新段 if (currentCleaned.size() >= segmentSize) { cleanedSegments.add(currentCleaned); currentCleaned = LogSegment.create(); } } if (currentCleaned != null && currentCleaned.size() > 0) { cleanedSegments.add(currentCleaned); } return cleanedSegments; } }

3.压缩触发条件

java

复制

下载

public class LogCleanerManager { // 压缩检查逻辑 public boolean needsCleaning(TopicPartition tp, Log log) { // 1. 检查Topic是否启用压缩 if (!log.config.compact) { return false; } // 2. 计算脏比率(Dirty Ratio) long firstDirtyOffset = log.firstDirtyOffset(); long logEndOffset = log.logEndOffset(); if (firstDirtyOffset == logEndOffset) { return false; // 没有脏数据 } double dirtyRatio = (double) (logEndOffset - firstDirtyOffset) / (logEndOffset - log.activeSegment().baseOffset()); // 3. 检查脏比率是否超过阈值 double thresholdRatio = log.config.minCleanableRatio; return dirtyRatio > thresholdRatio; } // 选择要压缩的分区 public List<TopicPartition> selectPartitionsToClean() { return allLogs.entrySet().stream() .filter(entry -> needsCleaning(entry.getKey(), entry.getValue())) .sorted((a, b) -> { // 按脏比率排序,最脏的优先 double ratioA = calculateDirtyRatio(a.getValue()); double ratioB = calculateDirtyRatio(b.getValue()); return Double.compare(ratioB, ratioA); }) .map(Map.Entry::getKey) .collect(Collectors.toList()); } }

三、删除策略实现

1.基于时间的删除策略

java

复制

下载

public class LogManager { // 基于时间的删除实现 public void deleteOldSegmentsByTime() { long now = time.milliseconds(); for (Log log : allLogs.values()) { // 检查每个段的创建时间 for (LogSegment segment : log.segments()) { long segmentAge = now - segment.created(); // 检查是否超过保留时间 if (segmentAge > log.config.retentionMs) { // 检查段是否可以被删除 if (canDeleteSegment(segment, log)) { deleteSegment(segment); } } } } } // 精确的保留时间检查 private boolean shouldDeleteByTime(LogSegment segment, long retentionMs, long currentTime) { // 获取段中最后一条消息的时间戳 long lastModified = segment.lastModified(); // 如果消息有时间戳,使用消息时间戳 if (log.config.messageTimestampType == TimestampType.LOG_APPEND_TIME) { lastModified = segment.maxTimestamp(); } return currentTime - lastModified > retentionMs; } }

2.基于大小的删除策略

java

复制

下载

public class LogManager { // 基于日志大小的删除 public void deleteOldSegmentsBySize() { for (Log log : allLogs.values()) { long totalSize = log.size(); long retentionSize = log.config.retentionSize; if (retentionSize < 0 || totalSize <= retentionSize) { continue; } // 计算需要删除多少数据 long bytesToDelete = totalSize - retentionSize; long bytesDeleted = 0; // 从最老的段开始删除 for (LogSegment segment : log.segments()) { if (bytesDeleted >= bytesToDelete) { break; } if (canDeleteSegment(segment, log)) { long segmentSize = segment.size(); deleteSegment(segment); bytesDeleted += segmentSize; } } } } }

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc

需要全套面试笔记及答案
【点击此处即可/免费获取】​​​

3.基于偏移量的删除策略

java

复制

下载

public class LogManager { // 保留最少数据(基于起始偏移量) public void deleteSegmentsToRetainMinOffset() { for (Log log : allLogs.values()) { long logStartOffset = log.logStartOffset(); long minOffsetToRetain = calculateMinOffsetToRetain(log); // 删除起始偏移量之前的所有段 for (LogSegment segment : log.segments()) { if (segment.baseOffset() < minOffsetToRetain) { if (canDeleteSegment(segment, log)) { deleteSegment(segment); } } else { break; // 按偏移量排序,后续的段不需要检查 } } } } // 计算最小保留偏移量 private long calculateMinOffsetToRetain(Log log) { // 考虑多个因素: // 1. Consumer滞后 // 2. 事务状态 // 3. 领导副本状态 long minConsumerOffset = Long.MAX_VALUE; // 获取所有消费者的最小偏移量 for (ConsumerState consumer : log.consumers()) { long offset = consumer.committedOffset(); minConsumerOffset = Math.min(minConsumerOffset, offset); } // 考虑事务控制消息 long transactionControlOffset = log.lastStableOffset(); // 返回需要保留的最小偏移量 return Math.max(log.logStartOffset(), Math.min(minConsumerOffset, transactionControlOffset)); } }

四、高级特性与优化

1.增量压缩与检查点

java

复制

下载

public class LogCleaner { // 压缩检查点管理 private class CleanerCheckpoint { private final Map<TopicPartition, Long> lastCleanOffset = new HashMap<>(); // 保存检查点 public synchronized void saveCheckpoint(TopicPartition tp, long cleanOffset) { lastCleanOffset.put(tp, cleanOffset); // 持久化到磁盘 try (FileOutputStream fos = new FileOutputStream(checkpointFile)) { Properties props = new Properties(); lastCleanOffset.forEach((k, v) -> props.setProperty(k.toString(), String.valueOf(v))); props.store(fos, "Log cleaner checkpoint"); } } // 加载检查点 public synchronized void loadCheckpoint() { try (FileInputStream fis = new FileInputStream(checkpointFile)) { Properties props = new Properties(); props.load(fis); props.forEach((k, v) -> { TopicPartition tp = parseTopicPartition(k.toString()); lastCleanOffset.put(tp, Long.parseLong(v.toString())); }); } } } // 增量压缩优化 public void incrementalClean() { for (TopicPartition tp : partitionsToClean) { Log log = getLog(tp); // 获取上次压缩位置 long lastCleanOffset = checkpoints.getOrDefault(tp, 0L); // 只压缩新的脏数据 long dirtyStart = Math.max(lastCleanOffset, log.firstDirtyOffset()); long dirtyEnd = log.logEndOffset(); if (dirtyStart < dirtyEnd) { CleanerTask task = new CleanerTask(tp, dirtyStart, dirtyEnd); taskQueue.add(task); } } } }

2.压缩策略配置

properties

复制

下载

# Kafka Broker配置示例 ############################# Log Compaction ############################# # 启用压缩 log.cleaner.enable=true # 清理线程数 log.cleaner.threads=8 # 清理器总内存 log.cleaner.dedupe.buffer.size=134217728 # 128MB # 压缩触发阈值 log.cleaner.min.cleanable.ratio=0.5 # 删除策略配置 log.retention.hours=168 # 基于时间:7天 log.retention.bytes=1073741824 # 基于大小:1GB log.retention.check.interval.ms=300000 # 每5分钟检查一次 # 段文件配置 log.segment.bytes=1073741824 # 1GB log.segment.ms=604800000 # 7天 log.segment.delete.delay.ms=60000 # 删除延迟1分钟

3.压缩性能优化

java

复制

下载

public class LogCleaner { // 内存优化 - 分块处理大日志 private List<LogSegment> cleanLargeLog(Log log, List<LogSegment> dirtySegments, long maxBufferSize) { List<LogSegment> cleanedSegments = new ArrayList<>(); long currentBufferUsage = 0; for (LogSegment segment : dirtySegments) { long segmentSize = segment.size(); if (currentBufferUsage + segmentSize > maxBufferSize) { // 分批处理 List<LogSegment> batch = new ArrayList<>(); batch.add(segment); List<LogSegment> cleanedBatch = doClean(batch); cleanedSegments.addAll(cleanedBatch); currentBufferUsage = 0; } else { currentBufferUsage += segmentSize; } } return cleanedSegments; } // IO优化 - 零拷贝和批量写入 private void optimizeIOPerformance() { // 使用sendfile系统调用 FileChannel sourceChannel = dirtySegment.fileChannel(); FileChannel targetChannel = cleanedSegment.fileChannel(); long position = 0; long count = dirtySegment.size(); // 零拷贝传输 sourceChannel.transferTo(position, count, targetChannel); // 批量写入索引 cleanedSegment.updateIndex(records); } }

五、监控与运维

1.压缩状态监控

java

复制

下载

public class LogCleanerMetrics { // 关键监控指标 private final Meter compactionRate = new Meter(); private final Histogram compactionLatency = new Histogram(); private final Gauge<Double> dirtyRatio = new Gauge<>(); private final Counter deletedMessages = new Counter(); private final Counter retainedMessages = new Counter(); // 暴露JMX指标 public void registerMBeans() { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName( "kafka.log:type=LogCleaner,name=" + topicPartition); mbs.registerMBean(new LogCleanerMXBean() { @Override public double getCompactionRate() { return compactionRate.getOneMinuteRate(); } @Override public double getAvgCompactionLatency() { return compactionLatency.getMean(); } @Override public double getDirtyRatio() { return dirtyRatio.getValue(); } @Override public long getDeletedMessages() { return deletedMessages.getCount(); } @Override public long getRetainedMessages() { retainedMessages.getCount(); } }, name); } }

2.运维命令与工具

bash

复制

下载

# 查看Topic的压缩状态 kafka-topics.sh --describe --topic my-compacted-topic --bootstrap-server localhost:9092 # 手动触发压缩 kafka-configs.sh --bootstrap-server localhost:9092 \ --entity-type topics \ --entity-name my-compacted-topic \ --alter --add-config "cleanup.policy=compact" # 查看压缩进度 kafka-run-class.sh kafka.tools.LogCleanerProgress \ --bootstrap-server localhost:9092 \ --topic my-compacted-topic # 检查段文件状态 kafka-dump-log.sh --files /tmp/kafka-logs/my-topic-0/00000000000000000000.log \ --print-data-log # 设置删除策略 kafka-configs.sh --bootstrap-server localhost:9092 \ --entity-type topics \ --entity-name my-topic \ --alter \ --add-config "retention.ms=604800000,retention.bytes=1073741824"

3.故障诊断与修复

java

复制

下载

public class LogCompactionValidator { // 验证压缩完整性 public void validateCompaction(TopicPartition tp) { Log log = getLog(tp); // 1. 检查key的唯一性 Map<Bytes, Long> keyOffsets = new HashMap<>(); for (LogSegment segment : log.segments()) { for (RecordBatch batch : segment.batches()) { for (Record record : batch) { if (record.hasKey()) { Bytes key = Bytes.wrap(record.key()); Long prevOffset = keyOffsets.get(key); long currentOffset = batch.baseOffset() + record.offsetDelta(); if (prevOffset != null && currentOffset > prevOffset) { // 发现重复的key,但偏移量更大 - 正常情况 } else if (prevOffset != null && currentOffset < prevOffset) { // 压缩错误:发现了更旧的key版本 logger.error("Compaction error: found older version of key {} " + "at offset {} than previous offset {}", key, currentOffset, prevOffset); } keyOffsets.put(key, currentOffset); } } } } // 2. 检查段连续性 long prevEndOffset = -1; for (LogSegment segment : log.segments()) { if (prevEndOffset != -1 && segment.baseOffset() != prevEndOffset) { logger.error("Segment gap found: prevEndOffset={}, baseOffset={}", prevEndOffset, segment.baseOffset()); } prevEndOffset = segment.baseOffset() + segment.sizeInRecords(); } } }

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc

需要全套面试笔记及答案
【点击此处即可/免费获取】​​​

六、最佳实践与配置建议

1.压缩策略选择指南

yaml

复制

下载

应用场景与配置建议: # 场景1: 变更数据捕获(CDC) cleanup.policy: compact,delete compression.type: snappy retention.ms: 604800000 # 7天 min.compaction.lag.ms: 3600000 # 延迟1小时压缩 # 场景2: 会话存储 cleanup.policy: compact,delete delete.retention.ms: 86400000 # 保留删除记录24小时 segment.ms: 3600000 # 每1小时一个段 min.cleanable.dirty.ratio: 0.1 # 快速压缩 # 场景3: 长期归档 cleanup.policy: compact retention.ms: -1 # 不基于时间删除 retention.bytes: 1099511627776 # 1TB segment.bytes: 5368709120 # 5GB大段文件 # 场景4: 高吞吐日志 cleanup.policy: delete retention.hours: 168 segment.bytes: 1073741824 # 1GB segment.ms: 604800000 # 7天

2.性能优化配置

properties

复制

下载

# 生产环境推荐配置 # 内存配置 log.cleaner.dedupe.buffer.size=268435456 # 256MB log.cleaner.io.buffer.size=524288 # 512KB log.cleaner.io.max.bytes.per.second=104857600 # 100MB/s限速 # 线程配置 log.cleaner.threads=4 # 根据CPU核心数调整 num.io.threads=8 num.network.threads=3 # 段配置 log.segment.bytes=1073741824 # 1GB log.index.interval.bytes=4096 # 每4KB建索引 log.flush.interval.messages=10000 log.flush.interval.ms=1000 # 删除策略 log.retention.check.interval.ms=300000 # 5分钟检查一次 log.segment.delete.delay.ms=60000 # 延迟1分钟删除 log.cleaner.backoff.ms=15000 # 压缩失败后等待15秒

3.常见问题解决方案

bash

复制

下载

# 问题1: 压缩速度慢 解决方案: 1. 增加清理线程数: log.cleaner.threads=8 2. 增加内存: log.cleaner.dedupe.buffer.size=536870912 3. 调整段大小: log.segment.bytes=536870912 # 问题2: 磁盘空间不足 解决方案: 1. 缩短保留时间: retention.ms=172800000 (2天) 2. 启用压缩: compression.type=lz4 3. 增加段删除频率: log.cleanup.policy=delete # 问题3: 压缩导致CPU使用率高 解决方案: 1. 降低压缩优先级: log.cleaner.io.max.bytes.per.second=52428800 2. 调整压缩阈值: log.cleaner.min.cleanable.ratio=0.75 3. 分时段压缩: 在业务低峰期进行压缩 # 问题4: Key重复导致数据丢失 解决方案: 1. 启用删除保留: delete.retention.ms=86400000 2. 监控压缩状态: 使用LogCleanerProgress工具 3. 定期验证数据完整性

七、总结

Kafka的Log Compaction和删除策略提供了灵活的数据生命周期管理:

核心优势:

  1. 空间效率:自动删除重复数据,节省存储空间

  2. 数据完整性:保证每个key至少有一个最新值

  3. 性能优化:增量压缩减少IO开销

  4. 灵活配置:支持时间、大小、偏移量多种删除策略

关键配置点:

  • cleanup.policy=compact:启用压缩

  • min.cleanable.dirty.ratio:控制压缩触发阈值

  • retention.ms/retention.bytes:设置删除策略

  • delete.retention.ms:删除记录的保留时间

最佳实践:

  • 根据业务场景选择合适的清理策略

  • 监控压缩状态和磁盘使用率

  • 定期验证数据完整性

  • 在生产环境前充分测试配置

正确配置Log Compaction和删除策略,可以在保证数据完整性的同时,显著提升Kafka集群的性能和存储效率。

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

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

相关文章

基于单片机热敏PT100温度采集系统设计

**单片机设计介绍&#xff0c;基于单片机热敏PT100温度采集系统设计 文章目录一 概要二、功能设计设计思路三、 软件设计原理图五、 程序一 概要 基于单片机热敏PT100温度采集系统设计概要如下&#xff1a; 一、设计目标 该系统旨在通过单片机技术实现对温度的实时监测和精确控…

四大GIS框架坐标系详解

四大GIS框架坐标系详解 一、一句话总结 Leaflet/Mapbox/OpenLayers默认用Web墨卡托&#xff08;EPSG:3857&#xff09;&#xff0c;Cesium默认用WGS-84&#xff08;EPSG:4326&#xff09;&#xff0c;但都支持坐标系扩展。二、详细对比表框架默认坐标系显示方式内部计算坐标单位…

2026 年最值得普通人死磕的3个AI赛道

2026年最值得普通人死磕的3个AI赛道 文章目录 2026年最值得普通人死磕的3个AI赛道 目录 第1章 为什么99%的普通人在AI赛道注定失败? 认知误区:将AI视为风口而非生产工具 反直觉洞见:风口思维的数学本质 案例:盲目跟风的AI绘画创业者 代码模拟:风口思维的失败概率 能力错配…

深入理解 C++ 的 lvalue / xvalue / prvalue 及 decltype 推导规则

深入理解 C 的 lvalue / xvalue / prvalue 及 decltype 推导规则本文系统梳理 C11 之后的三大表达式值类别&#xff08;lvalue / xvalue / prvalue&#xff09;&#xff0c;并重点结合 decltype 与 decltype(auto) 说明其在真实工程代码中的行为差异与常见陷阱。一、为什么要理…

滚球老鼠标编码器识别上下左右移动方向的原理

滚球老鼠标编码器识别上下左右移动方向的原理 滚球老鼠标&#xff08;又称机械/光机鼠标&#xff09;的编码器通过“机械传动光学编码相位差解码”的组合逻辑&#xff0c;实现对上下、左右四个移动方向的识别。核心原理是将滚球的平面滚动分解为两个垂直轴的旋转运动&#xff0…

安防设备的网络安全实战指南:常见网络攻击手法剖析与防范技术演进

伴随着互联网的发展&#xff0c;它已经成为我们生活中不可或缺的存在&#xff0c;无论是个人还是企业&#xff0c;都离不开互联网。正因为互联网得到了重视&#xff0c;网络安全问题也随之加剧&#xff0c;给我们的信息安全造成严重威胁&#xff0c;而想要有效规避这些风险&…

滚球老鼠标编码器识别上下左右移动方向的原理2

滚球老鼠标编码器识别上下左右移动方向的原理 滚球老鼠标&#xff08;又称机械/光机鼠标&#xff09;的编码器通过“机械传动光学编码相位差解码”的组合逻辑&#xff0c;实现对上下、左右四个移动方向的识别。核心原理是将滚球的平面滚动分解为两个垂直轴的旋转运动&#xff0…

构建企业级安全防御架构:网络安全防范核心技术盘点与实施要点解析

伴随着互联网的发展&#xff0c;它已经成为我们生活中不可或缺的存在&#xff0c;无论是个人还是企业&#xff0c;都离不开互联网。正因为互联网得到了重视&#xff0c;网络安全问题也随之加剧&#xff0c;给我们的信息安全造成严重威胁&#xff0c;而想要有效规避这些风险&…

基于单片机无线公交车人数统计装置系统设计

**单片机设计介绍&#xff0c;基于单片机无线公交车人数统计装置系统设计 文章目录一 概要二、功能设计设计思路三、 软件设计原理图五、 程序一 概要 基于单片机无线公交车人数统计装置系统设计概要如下&#xff1a; 一、系统概述 本系统采用单片机作为核心控制器&#xff0…

网络安全从入门到精通:核心领域深度剖析与实战技术指南

网络安全技术虽然非常复杂&#xff0c;但是归纳起来&#xff0c;主要就是为了解决以下三方面问题&#xff1a; 1.数据的机密性&#xff1a;即如何令人们发送数据&#xff0c;即使被其他无关人员截取&#xff0c;他们也无法获知数据的含义。 2.数据的有效性&#xff1a;指数据不…

滚球老鼠标DIY改造成游戏光枪完整方案

滚球老鼠标DIY改造成游戏光枪完整方案 核心改造逻辑&#xff1a;复用滚球老鼠标的「X/Y轴编码器」&#xff08;负责瞄准方向识别&#xff09;和「信号传输模块」&#xff0c;新增「光定位模块」&#xff08;捕捉屏幕定位点&#xff09;、「射击按键」&#xff08;触发射击信号&…

基于单片机智能自动加料机控制系统设计

**单片机设计介绍&#xff0c;基于单片机智能自动加料机控制系统设计 文章目录一 概要二、功能设计设计思路三、 软件设计原理图五、 程序一 概要 基于单片机智能自动加料机控制系统设计概要如下&#xff1a; 一、系统概述 本设计旨在通过单片机技术实现一种智能自动加料机控…

基于单片机智能红外遥控密码锁系统设计

**单片机设计介绍&#xff0c;基于单片机智能红外遥控密码锁系统设计 文章目录一 概要二、功能设计设计思路三、 软件设计原理图五、 程序一 概要 基于单片机智能红外遥控密码锁系统设计概要如下&#xff1a; 一、系统概述 本系统采用单片机技术结合无线红外遥控技术&#xf…

一文搞定网络安全:核心概念、技术分类与实战防范清单(建议收藏)

伴随着互联网的发展&#xff0c;它已经成为我们生活中不可或缺的存在&#xff0c;无论是个人还是企业&#xff0c;都离不开互联网。正因为互联网得到了重视&#xff0c;网络安全问题也随之加剧&#xff0c;给我们的信息安全造成严重威胁&#xff0c;而想要有效规避这些风险&…

2026年面试必问的Java面试八股文及答案整理(全面覆盖·精选优质·高效直击)

Java 面试 Java 作为编程语言中的 NO.1,选择入行做 IT 做编程开发的人&#xff0c;基本都把它作为首选语言,进大厂拿高薪也是大多数小伙伴们的梦想。以前 Java 岗位人才的空缺&#xff0c;而需求量又大&#xff0c;所以这种人才供不应求的现状&#xff0c;就是 Java 工程师的薪…

网络安全检测实战指南:核心方法、工具应用与在渗透测试/安全运维中的实践

一&#xff0c;网络安全漏洞 安全威胁是指所有能够对计算机网络信息系统的网络服务和网络信息的机密性&#xff0c;可用性和完整性产生阻碍&#xff0c;破坏或中断的各种因素。安全威胁可分为人为安全威胁和非人为安全威胁两大类。 1&#xff0c;网络安全漏洞威胁 漏洞分析的…

6004BZ10300处理器模块

6004BZ10300 处理器模块产品概述 6004BZ10300 是工业级处理器模块&#xff0c;用于分布式控制系统&#xff08;DCS&#xff09;或可编程逻辑控制器&#xff08;PLC&#xff09;中执行核心控制功能。它负责实时处理输入信号、运行控制程序、执行算法&#xff0c;并输出控制信号给…

基于Arduino的温湿度pm2.5wifi联网设计

**单片机设计介绍&#xff0c;基于Arduino的温湿度pm2.5wifi联网设计 文章目录一 概要二、功能设计设计思路三、 软件设计原理图五、 程序一 概要 基于Arduino的温湿度PM2.5 WiFi联网设计概要如下&#xff1a; 一、设计背景与目的 随着物联网技术的快速发展&#xff0c;环境监…

滚珠丝杠厂家排名靠前品牌,产品负载与寿命表现怎么样

滚珠丝杠的负载能力和使用寿命是工业设备的核心指标&#xff0c;直接影响运行效率与维护周期。采购人员选型时&#xff0c;常会关注滚珠丝杠厂家排名靠前品牌的负载与寿命表现&#xff0c;毕竟这些指标关系到长期成本。那么&#xff0c;这些品牌的表现究竟如何&#xff1f;滚珠…

6002BZ10200内存板

6002BZ10200 内存板产品概述 6002BZ10200 是一款工业级内存板&#xff0c;主要用于分布式控制系统&#xff08;DCS&#xff09;、可编程逻辑控制器&#xff08;PLC&#xff09;或其他工业自动化控制系统中。它提供对控制程序、过程数据及历史数据的高速存储与访问功能&#xff…