Kafka深度解析与实战应用
Kafka深度解析与实战应用
作者:LedgerX技术团队
发布日期:2025年4月16日
引言
在当今数字时代,数据已成为企业的核心资产,而高效处理大规模数据流的能力则成为现代后端系统的关键挑战之一。Apache Kafka作为一个分布式流处理平台,凭借其卓越的可扩展性、高吞吐量和容错能力,已成为构建实时数据管道和流处理应用的首选技术。在LedgerX的技术栈中,Kafka扮演着数据中枢神经系统的角色,为我们的分布式账本和金融交易系统提供了强大的支撑。
本文将深入探讨Kafka的核心概念、架构设计以及在金融科技领域的实际应用,并分享LedgerX团队在使用Kafka过程中的实践经验与优化策略。
一、Kafka核心概念与架构
1.1 Kafka基础架构
Kafka的基础架构由以下几个关键组件构成:
- Broker:Kafka集群由多个Broker组成,每个Broker是一个独立的服务器实例。
- Topic:消息的逻辑分类,每个Topic可以分为多个Partition。
- Partition:Topic的物理分区,提供并行处理能力,是Kafka扩展性的基础。
- Producer:生产者,负责将消息发布到指定的Topic。
- Consumer:消费者,订阅Topic并处理其中的消息。
- Consumer Group:消费者组,同一组内的消费者共同消费Topic的消息,每条消息只会被组内一个消费者处理。
- ZooKeeper/KRaft:负责管理和协调Kafka集群(注:Kafka 3.x版本后逐步移除ZooKeeper依赖,转向KRaft模式)。
1.2 数据持久化与复制机制
Kafka的核心优势之一是其独特的数据持久化设计:
- 日志追加模式:Kafka采用追加写入的方式存储消息,这种顺序IO模式比随机写入更高效。
- 分段日志:每个Partition被划分为多个Segment,便于管理和清理过期数据。
- 零拷贝技术:通过sendfile系统调用,直接从文件系统缓存传输到网络通道,避免了内核空间和用户空间的数据拷贝,大幅提升性能。
- 复制机制:通过Leader-Follower模式实现数据复制,确保高可用性和容错性。
// Kafka生产者示例代码
Properties props = new Properties();
props.put("bootstrap.servers", "kafka-broker1:9092,kafka-broker2:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("acks", "all"); // 确保消息被所有副本接收Producer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord<>("transaction-events", "transaction-123", "{\"amount\":1000,\"currency\":\"USD\"}");// 异步发送
producer.send(record, (metadata, exception) -> {if (exception != null) {// 处理错误logger.error("Failed to send message", exception);} else {// 发送成功logger.info("Message sent to partition {} with offset {}", metadata.partition(), metadata.offset());}
});// 同步发送 (阻塞等待)
// RecordMetadata metadata = producer.send(record).get();// 关闭生产者
producer.close();
1.3 分区策略与消费模型
Kafka的分区和消费模型设计精妙,为系统提供了极高的扩展性:
- 分区策略:默认提供轮询(Round Robin)、随机(Random)和基于键的哈希(Key Hash)三种分区策略。
- 消费模型:Pull模型,消费者主动从Broker拉取消息,控制消费速率。
- 消费者偏移管理:每个Consumer Group会跟踪每个Partition的消费位置(offset),支持自动或手动提交。
- 再平衡机制:当Consumer Group成员变化时,Kafka会自动重新分配Partition,确保负载均衡。
二、Kafka在金融科技中的应用场景
2.1 实时交易处理
在LedgerX系统中,我们使用Kafka构建了低延迟的交易处理流水线:
- 交易捕获:前端系统将交易请求发送到Kafka的
transactions
主题。 - 风控检查:风控服务消费交易消息,进行实时风险评估,结果写入
risk-assessment
主题。 - 账本更新:账本服务根据风控结果,执行账户余额更新,写入
ledger-updates
主题。 - 清算结算:清算服务处理账本更新,执行最终的结算流程。
这种流式处理架构将交易处理解耦为独立的阶段,每个阶段可以独立扩展,大大提高了系统的吞吐量和弹性。
2.2 数据复制与同步
在分布式账本系统中,数据一致性至关重要。我们利用Kafka的强一致性保证,实现了跨数据中心的账本数据同步:
- 主数据中心的变更事件写入Kafka集群
- 从数据中心通过Kafka Mirror Maker 2复制这些事件
- 保证即使在主数据中心故障的情况下,也能快速切换到从数据中心,实现业务连续性
2.3 事件溯源与CQRS模式
LedgerX的账本系统采用事件溯源架构,Kafka在其中扮演事件存储的角色:
- 所有状态变更以事件形式记录在Kafka中
- 系统状态通过重放事件流重建
- 结合CQRS(命令查询责任分离)模式,写入和查询分别优化
// 事件溯源示例 - 账户服务
public class AccountEventProcessor {private final KafkaConsumer<String, String> consumer;private final Map<String, Account> accountStateStore = new ConcurrentHashMap<>();public void processEvents() {consumer.subscribe(Collections.singletonList("account-events"));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {AccountEvent event = parseEvent(record.value());String accountId = event.getAccountId();// 获取当前账户状态,如果不存在则创建Account account = accountStateStore.getOrDefault(accountId, new Account(accountId));// 应用事件到状态account.apply(event);// 更新状态存储accountStateStore.put(accountId, account);}// 提交消费位置consumer.commitSync();}}// 其他方法...
}
2.4 实时监控与分析
金融系统需要严格的监控和审计。我们构建了基于Kafka的流处理分析管道:
- 系统行为日志和指标流入专用的监控主题
- Kafka Streams应用处理和聚合这些数据
- 异常模式被实时检测并触发警报
- 聚合数据送入时序数据库供仪表板展示
三、Kafka优化实践与性能调优
3.1 Broker配置优化
在LedgerX的生产环境中,我们对Kafka Broker进行了以下关键优化:
参数 | 推荐值 | 说明 |
---|---|---|
num.network.threads | 8 | 处理网络请求的线程数 |
num.io.threads | 16 | 处理磁盘IO的线程数 |
socket.send.buffer.bytes | 1048576 | 设置较大的套接字缓冲区提高吞吐量 |
socket.receive.buffer.bytes | 1048576 | 同上 |
socket.request.max.bytes | 104857600 | 控制单个请求的最大大小 |
log.retention.hours | 168 | 根据业务需求和合规要求设置日志保留时间 |
log.segment.bytes | 1073741824 | 日志段大小,影响文件管理效率 |
log.flush.interval.messages | 10000 | 控制刷盘频率,权衡性能与持久性 |
log.flush.interval.ms | 1000 | 同上 |
replica.fetch.max.bytes | 1048576 | 复制操作单次获取的最大字节数 |
3.2 生产者优化
在高吞吐量场景下,我们对Producer进行了以下调优:
// 高性能生产者配置
Properties props = new Properties();// 基本配置
props.put("bootstrap.servers", "kafka1:9092,kafka2:9092,kafka3:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");// 性能优化参数
props.put("buffer.memory", 67108864); // 64MB缓冲区
props.put("batch.size", 131072); // 128KB批次大小
props.put("linger.ms", 5); // 等待5ms收集更多消息到批次
props.put("compression.type", "lz4"); // 使用LZ4压缩,平衡CPU和网络带宽
props.put("acks", "1"); // 只需要Leader确认,提高吞吐量
props.put("max.in.flight.requests.per.connection", 5); // 允许更多未确认请求// 可靠性配置
props.put("retries", 3); // 失败重试次数
props.put("retry.backoff.ms", 100); // 重试等待时间
props.put("enable.idempotence", true); // 启用幂等性,防止消息重复Producer<String, String> producer = new KafkaProducer<>(props);
3.3 消费者优化
消费者端的优化主要围绕批量处理和并行度展开:
// 高性能消费者配置
Properties props = new Properties();
props.put("bootstrap.servers", "kafka1:9092,kafka2:9092,kafka3:9092");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("group.id", "transaction-processor");// 性能优化参数
props.put("fetch.min.bytes", 1024 * 1024); // 至少获取1MB数据
props.put("fetch.max.bytes", 52428800); // 最多获取50MB数据
props.put("max.poll.records", 500); // 单次拉取500条记录
props.put("max.partition.fetch.bytes", 1048576); // 每个分区最多获取1MB// 提交策略
props.put("enable.auto.commit", "false"); // 禁用自动提交,手动控制
props.put("auto.offset.reset", "earliest"); // 新消费者组从头开始消费KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
3.4 监控指标与关键警报
有效的监控对于保障Kafka集群的稳定性至关重要。在LedgerX,我们关注以下关键指标:
- Broker健康度:UnderReplicatedPartitions、OfflinePartitionsCount、ActiveControllerCount
- 性能指标:BytesInPerSec、BytesOutPerSec、RequestsPerSec、RequestQueueSize
- 消费滞后:ConsumerLag(各消费者组)
- 资源使用:CPU使用率、内存使用、磁盘I/O、网络I/O
- GC性能:GC暂停时间、收集频率
我们设置了多级警报阈值,确保在问题恶化前能及时干预。
四、Kafka高可用架构设计
4.1 多数据中心部署
LedgerX的Kafka集群采用跨数据中心部署策略:
- 活跃-活跃模式:两个主数据中心同时提供服务,通过MirrorMaker 2进行双向复制
- 就近接入:客户端连接地理位置最近的数据中心
- 灾难恢复:任一数据中心故障时,流量自动切换至健康数据中心
4.2 分区副本策略
为了平衡可用性和性能,我们采用如下副本策略:
- 关键业务主题使用3个副本(1个Leader + 2个Follower)
- 次要主题使用2个副本(1个Leader + 1个Follower)
- 所有主题配置
min.insync.replicas=2
,确保至少2个副本确认写入 - 通过机架感知分配策略,确保副本分布在不同机架的Broker上
4.3 集群弹性伸缩
随着业务增长,Kafka集群需要具备弹性扩展能力:
- Broker扩容:按照预设的阈值(例如磁盘使用率>70%),通过自动化脚本添加新的Broker
- 分区重平衡:使用Kafka提供的分区重分配工具,将负载均匀分布到新Broker
- 主题扩容:通过监控工具识别热点主题,自动增加其分区数量
五、安全与合规考量
5.1 身份认证与访问控制
金融领域对数据安全有严格要求,我们在Kafka集群中实施了全面的安全措施:
- TLS加密:所有客户端与集群间通信采用TLS加密
- SASL认证:使用SASL/SCRAM进行身份验证
- ACL权限控制:基于角色的细粒度访问控制,遵循最小权限原则
- 授权审计:记录所有授权决策,支持合规审计
# 服务器端安全配置示例
listeners=SASL_SSL://kafka1.ledgerx.com:9093
advertised.listeners=SASL_SSL://kafka1.ledgerx.com:9093
security.inter.broker.protocol=SASL_SSL
ssl.keystore.location=/etc/kafka/secrets/kafka.server.keystore.jks
ssl.keystore.password=${KEYSTORE_PASSWORD}
ssl.key.password=${KEY_PASSWORD}
ssl.truststore.location=/etc/kafka/secrets/kafka.server.truststore.jks
ssl.truststore.password=${TRUSTSTORE_PASSWORD}
ssl.client.auth=required
sasl.enabled.mechanisms=SCRAM-SHA-512
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
super.users=User:admin
5.2 数据加密与脱敏
对于敏感财务数据,我们实施了多层防护:
- 传输加密:通过TLS保护传输中的数据
- 内容加密:敏感字段在生产者端进行加密,仅授权服务可解密
- 数据脱敏:监控和调试主题中的个人信息自动脱敏
六、最佳实践与经验总结
在LedgerX的Kafka使用过程中,我们总结了以下宝贵经验:
6.1 架构设计原则
- 主题设计:按业务领域和数据类型划分主题,避免过度集中或过度分散
- 分区策略:分区数量 = min(预期吞吐量÷单分区吞吐量, 3×Broker数)
- 消息键设计:精心设计消息键,确保相关消息路由到同一分区,保持顺序性
- 避免庞大消息:大消息(>1MB)考虑存储在外部系统,Kafka中只保留引用
6.2 运维最佳实践
- 滚动更新:制定详细的滚动更新流程,逐个更新Broker,避免服务中断
- 容量规划:预留50%的额外容量以应对流量尖峰和Broker故障
- 定期演练:定期进行故障恢复演练,验证高可用策略的有效性
- 监控完善:构建多维度监控系统,涵盖基础设施、Kafka集群和应用指标
6.3 避坑指南
在实践中,我们遇到并解决了以下典型问题:
- 消费者再平衡风暴:通过增加
session.timeout.ms
和heartbeat.interval.ms
参数,减少不必要的再平衡 - 磁盘IO瓶颈:使用RAID10阵列和SSD存储,分离数据目录和日志目录
- 内存管理:为Kafka预留足够堆内存,但避免过大导致GC暂停时间延长
- 网络配置:优化系统网络参数,提高并发连接处理能力
# 系统参数优化
echo "net.core.somaxconn=65536" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog=65536" >> /etc/sysctl.conf
echo "net.core.netdev_max_backlog=65536" >> /etc/sysctl.conf
echo "net.ipv4.tcp_rmem=4096 87380 16777216" >> /etc/sysctl.conf
echo "net.ipv4.tcp_wmem=4096 65536 16777216" >> /etc/sysctl.conf
echo "vm.swappiness=1" >> /etc/sysctl.conf
echo "vm.dirty_ratio=60" >> /etc/sysctl.conf
echo "vm.dirty_background_ratio=30" >> /etc/sysctl.conf
sysctl -p
结语
Apache Kafka作为现代分布式系统的核心组件,为LedgerX提供了可靠、高性能的消息传递基础设施。通过深入了解Kafka的工作原理并根据金融业务场景进行优化,我们构建了一个能够支撑每秒数十万交易处理的高弹性系统。
随着业务的发展和技术的演进,我们将持续优化Kafka集群,探索更多创新应用场景。同时,我们也欢迎社区朋友就Kafka的应用和优化分享经验,共同推动金融科技基础设施的发展。
在接下来的系列文章中,我们将继续深入探讨LedgerX技术栈的其他关键组件以及架构设计理念,敬请期待。
参考资源
- Apache Kafka官方文档
- Kafka权威指南
- Confluent Developer Center
相关文章:
Kafka深度解析与实战应用
Kafka深度解析与实战应用 作者:LedgerX技术团队 发布日期:2025年4月16日 引言 在当今数字时代,数据已成为企业的核心资产,而高效处理大规模数据流的能力则成为现代后端系统的关键挑战之一。Apache Kafka作为一个分布式流处理平台…...
数学教学通讯杂志数学教学通讯杂志社数学教学通讯编辑部2025年第6期目录
课程教材教法 “课程思政”视域下的高中数学教学探索与实践——以“函数概念的发展历程”为例 赵文博; 3-617 PBL教学模式下高中统计教学的探索与实践——以“随机抽样(第一课时)”为例 陈沛余; 7-10 “三新”背景下的高中数学教学困境与应对…...
【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(二)
本篇博客给大家带来的是多线程中synchronize的实现原理和JUC(java.util.concurrent) 常见类的相关知识点. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的…...
Flutter PIP 插件 ---- iOS Video Call 自定义PIP WINDOW渲染内容
以下是一篇关于在 iOS 中实现画中画(PiP)功能的技术博客: iOS 画中画(PiP)功能实现指南 效果 简介 画中画(Picture in Picture, PiP)是一项允许用户在使用其他应用时继续观看视频内容的功能。本文将详细介绍如何在 iOS 应用中实现 PiP 功能,包括自定义内容渲染和…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——4G模块ME3630测试
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:https://www.alientek.com/Product_Details/135.html 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——4G模…...
高并发内存池(四):内存释放原理与实现
前言:经过前3期的攻坚,我们已完整实现了内存动态申请的核心模块。接下来将进入关键阶段——内存释放机制的理解与实现,这是构建完整 高并发内存池 的最后一块技术拼图。该模块完成后,项目主体架构将基本成型(达90%&…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——EEPROM、SPI FLASH测试 #AT24C64 #W25Q128
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:https://www.alientek.com/Product_Details/135.html 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——EEP…...
《突破控件限制:用Qt绘图API解锁高级界面定制能力》
一、基本概念 虽然 Qt 已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景。很多时候我们需要更强的 “自定制” 能力。 Qt 提供了画图相关的 API,允许我们在窗口上绘制任意的图形形状来完成更复杂的界面设计 所谓的 “控件” 本质上也是通…...
MyBatis-Plus 中BaseMapper接口是如何加速微服务内部开发的?
假设我们有一个简单的微服务项目,需要对 User 实体进行基本的数据库操作。 场景一:使用原生 MyBatis 的开发流程 (作为对比) 定义实体类 (Entity): // package com.yourcompany.usermicroservice.entity; public class User {private Long id;private S…...
AIGC-十款数据分析类智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…...
鸿蒙应用(医院陪诊系统)开发篇1·主页面的tabs布局
引言: 首先可在鸿蒙开发者官网找到DevEco Studio的安装教程。 安装好了之后,我们开始开发。 知识点: tabs布局,鸿蒙官方文档地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-contai…...
【大模型】DeepSeek + Coze 打造个人专属AI智能体使用详解
目录 一、前言 二、AI智能体介绍 2.1 什么是AI智能体 2.2 AI智能体核心能力 2.3 AI智能应用场景 三、coze 介绍 3.1 coze是什么 3.1.1 平台概述 3.1.2 平台适用人群 3.2 平台核心功能 3.3 coze可以做什么 3.4 为什么选择coze 四、coze 搭建AI智能体操作实践 4.1 搭…...
7.(vue3.x+vite)弹性布局(flex布局)
1:效果截图 2:代码实现 <template><span style="font-size: 20px">右边固定,左边自适应</span><div class=<...
Python基础总结(五)之字典
文章目录 一、字典的格式二、字典的操作2.1 增加项2.1.1 直接增加项2.1.1 formkeys方法 2.2 删除项2.2.1 clear()方法2.2.2 pop()方法 2.3 修改项2.3.1 直接修改2.3.2 update()方法 2.4 查找项2.4.1 get()方法2.4.2 直接查询2.4.3 items()方法2.4.4 keys()方法2.4.5 values()方…...
MCP简介:重构人机交互底层逻辑
在人工智能技术飞速发展的今天,大语言模型(LLM)的应用场景正不断拓展,但模型与外部系统之间的连接方式却成为制约其潜力发挥的关键瓶颈。为了解决这一难题,由AI领域顶尖公司Anthropic(Claude模型背后的开发…...
LangChain缓存嵌入技术完全指南:CacheBackedEmbedding原理与实践(附代码示例)
一、嵌入缓存技术背景与应用场景 1.1 为什么需要嵌入缓存? 算力消耗问题:现代嵌入模型(如text-embedding-3-small)单次推理需要约0.5-1秒/文本 资源浪费现状:实际业务中约30%-60%的文本存在重复计算 成本压力&#…...
国产DPU芯片+防火墙,能否引领网络安全新跨越?
近日,国内首款搭载国产DPU芯片的800Gbps下一代防火墙——中科网威NSFW - 12000正式发布,引发行业广泛关注。 国产DPU芯片与防火墙的结合,正在推动网络安全领域实现技术突破与体系升级。以下从技术特性、应用场景和产业价值三个维度分析其引领…...
Spark-SQL与Hive的连接及数据处理全解析
Spark-SQL与Hive的连接及数据处理全解析 在大数据处理领域,Spark-SQL和Hive都是重要的工具。今天就来聊聊Spark-SQL如何连接Hive以及相关的数据处理操作。 Spark-SQL连接Hive有多种方式。内嵌Hive虽然使用简单,直接就能用,但在实际生产中…...
ArcGIS Desktop使用入门(四)——9版本与10版本区别
系列文章目录 ArcGIS Desktop使用入门(一)软件初认识 ArcGIS Desktop使用入门(二)常用工具条——标准工具 ArcGIS Desktop使用入门(二)常用工具条——编辑器 ArcGIS Desktop使用入门(二&#x…...
使用 chromedriver 实现网络爬虫【手抄】
1、引用 selenium 包 <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.29.0</version> </dependency> <dependency><groupId>org.seleniumhq.seleniu…...
ERROR: Unknown host CPU architecture: arm64
1、先检查NDK版本是否支持arm64,NDK版本21.3以上 2、检查gradle中,有关NDK版本是否设置arm64-v8a 例如: ndkVersion "21.4.7075529"ndk {abiFilters "armeabi-v7a","arm64-v8a"} local.properties中&#x…...
从 SQL2API 到 Text2API:开启数据应用开发的新征程
在技术革新浪潮的席卷下,数据应用开发领域正经历着深刻变革。曾经,构建数据 API 需要开发者具备扎实的数据库知识和编程技能,手动编写复杂的 SQL 查询与 API 代码,这一过程不仅耗时费力,还将众多非技术人员阻挡在数据应…...
OpenCv高阶(四)——角点检测
一、角点检测 在计算机视觉中,角点检测是识别图像中局部区域(角点)的关键技术,这些区域通常是两条或多条边缘的交点,具有丰富的结构信息,常用于图像匹配、跟踪、三维重建等任务。 Harris角点检测算法是一…...
centos8 部署 openstack
在 CentOS 8 上部署 OpenStack 是一个复杂的过程,涉及多个组件的安装和配置。OpenStack 是一个开源的云计算平台,它提供了基础设施即服务(IaaS)的功能。下面我将指导你通过基本的步骤来部署 OpenStack。 前提条件 系统要求&#…...
智能云图库-8-AI编辑
一、基础图片编辑 需求分析 在日常的图片管理中,用户经常需要对图片进行简单处理,比如裁剪多余部分、旋转图片、放大缩小尺寸等。 因此,我们首先要引入基础图片编辑功能,帮助用户快速完成以下操作: 裁剪&#…...
libwebsocket建立服务器需要编写LWS_CALLBACK_ADD_HEADERS事件处理
最近在使用libwebsocket,感觉它搭建Http与websocket服务器比较简单,不像poco库那么庞大,但当我使用它建立websocket服务器后,发现websocket客户端连接一直没有连接成功,不知道什么原因,经过一天的调试&…...
L1-002 打印沙漏
L1-002 打印沙漏 - 团体程序设计天梯赛-练习集 (pintia.cn) 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ************ *****所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐&#…...
JSP技术入门指南【一】利用IDEA从零开始搭建你的第一个JSP系统
Jsp技术入门指南【一】利用IDEA从零开始搭建你的第一个JSP系统 前言一、什么是JSP1.1 JSP是干什么的?1.2 JSP与Servlet的关系是什么? 二、在Idea中创建第一个JSP系统三、JSP和HTML的差别3.1 格式区别3.2 注释区别 前言 在前面的内容中,我们已…...
NLP高频面试题(四十四)——RLHF过程中的马尔科夫决策过程及对话场景MDP设计
什么是马尔科夫决策过程(MDP)? 马尔科夫决策过程(MDP)是描述序贯决策问题的数学框架,由五元组( (S, A, P, R, \gamma) )组成,其中: (S):状态集合,描述环境的所有可能状态。(A):动作集合,描述智能体可以采取的所有可能动作。(P):状态转移概率函数,表示从一个状态…...
青少年编程与数学 02-016 Python数据结构与算法 24课题、密码学算法
青少年编程与数学 02-016 Python数据结构与算法 24课题、密码学算法 课题摘要:一、对称加密算法AES(高级加密标准)DES(数据加密标准)3DES(三重数据加密标准) 二、非对称加密算法RSAECC(椭圆曲线…...
艺术字体AI生成阿里云WordArt锦书、通义万相、SiliconFlow、Pillow+OpenCV本地生成艺术字体
基于您的需求,结合最新API技术和搜索结果,以下是Python调用主流艺术字API的代码案例及对应充值链接方案: 一、大厂API服务(付费方案) 1. 阿里云WordArt锦书API # 文字纹理生成(需安装dashscopeÿ…...
GIS开发笔记(7)结合osg及osgEarth实现不同高度下的三个圆形区域形成的三维覆盖轮廓区域绘制
一、实现效果如下: 二、实现原理 输入四个坐标点,第一个点为中心点,第二三四个点分别以中心点与地面垂线所在线上的各自高度水平面的交点为圆心旋转360进行圆形区域绘制,然后将三个不同高度上的圆形区域进行结合形成三维覆盖区域…...
解决 Kubernetes 调度器启动报错:缺少 Bind 插件
解决 Kubernetes 调度器启动报错:缺少 Bind 插件 问题描述 在启动自定义 Kubernetes 调度器时,出现了以下错误: I0416 17:08:41.420188 68788 configfile.go:57] "KubeSchedulerConfiguration v1beta2 is deprecated in v1.25, wil…...
Spring Batch 专题系列(六):并行处理与性能优化
1. 引言 在上一篇文章中,我们学习了 Spring Batch 的错误处理机制(Skip、Retry、Restart 和 Listener),掌握了如何提升作业的健壮性。随着数据量的增加,批处理任务的性能成为关键挑战。Spring Batch 提供了强大的并行处理功能,包括多线程 Step、分区(Partitioning)和并…...
WPF 从Main()方法启动
1.去掉App.xaml StartupUri“MainWindow.xaml” 只会让App.g.cs 不生成这行代码,但是还是会生成的App.g.cs文件中生成Main方法 this.StartupUri new System.Uri("MainWindow.xaml", System.UriKind.Relative);默认的App.xaml的生成操作是 应用程序定义…...
记录小程序第一次调用Api,基于腾讯云Serverless函数,实现小程序的成功接入api,以及数据调用
目录 创建腾讯云个人账户新建severless应用建立函数URL小程序中调用api示例 创建腾讯云个人账户 百度搜索即可,并注册 新建severless应用 作者以github下载的某Api为例,这里不展示具体Api,只关注操作即可,相信都是互通的 在腾…...
「数据可视化 D3系列」入门第四章:DOM操作与元素管理
DOM操作与元素管理 核心技能:元素选择与操作一、元素选择:精准定位DOM节点基础选择方法对比进阶选择技巧 二、元素插入:动态构建DOM结构append() vs insert()实际应用示例 三、元素删除:优雅移除DOM节点删除操作最佳实践 四、内容…...
突发重磅消息!!!CVE项目将被取消?
突发重磅消息!!!CVE项目将被取消?突发!来自可靠消息来源。MITRE 对 CVE 项目的支持将于明天到期。附件信件已发送给 CVE 董事会成员。https://mp.weixin.qq.com/s/N3qkiHaDfzDuBMK3JbBCjw...
基于uniapp的鸿蒙APP大数据量性能优化
文章目录 一、问题诊断与性能瓶颈分析1.1 大数据场景下的典型性能问题1.2 性能监测工具使用1.2.1 HBuilderX内置分析器1.2.2 鸿蒙DevEco工具链1.2.3 自制性能埋点 二、数据加载优化方案2.1 分页加载实现(带错误重试机制)2.2 数据流优化策略2.2.1 数据压缩…...
【算法】归并排序
算法系列七:归并排序 一、归并排序的递归探寻 1.思路 2.搭建 2.1设计过掉不符情况(在最底层时) 2.2查验能实现基础排序(在最底层往上点时) 2.3跳转结果继续往上回搭 3.实质 4.实现 二、递归的调用栈 1.递归的…...
【JavaScript】二十三、M端事件 + 轮播图Swiper插件
文章目录 1、M端事件2、swiper插件2.1 插件2.2 轮播图插件Swiper的使用 3、案例:学生信息表 1、M端事件 移动端有一个独有的事件:触屏事件 touch(也称触摸事件),Android 和 IOS 都有,touch 对象代表一个触摸点。触摸点可能是一根…...
【Spring】DI(依赖注入)详解:属性注入@Autowired(超详细)、构造方法注入、Setter注入
1.DI(依赖注入)介绍 1.1DI是什么? DI(Dependency Injection,依赖注入) 是 Spring 框架中实现 IoC(控制反转)的一种核心机制。如果说 IoC 是一种设计思想,告诉我们“把控…...
Spring Boot 中配置 Redis 连接池的详细
目录 一、添加依赖二、配置 Redis 连接池(一)通过 Java 配置类(二)通过 application.properties 文件 三、测试 Redis 操作四、总结 一、添加依赖 在 pom.xml 文件中添加以下依赖: <dependencies><dependen…...
系统架构设计师:系统架构概述案例分析与简答题、详细解析与评分要点
10道系统架构概述知识体系案例分析与简答题,涵盖架构设计原则、质量属性、演化过程、评估方法等核心考点,并附详细解析与评分要点: 一、案例分析题(5题) 1. 电商系统高并发场景下的架构设计 背景:某电商平…...
关于系统架构思考,如何设计实现系统的高可用?
绪论、系统高可用的必要性 系统高可用为了保持业务连续性保障,以及停机成本量化,比如在以前的双十一当天如果出现宕机,那将会损失多少钱?比如最近几年Amazon 2021年30分钟宕机损失$5.6M。当然也有成功的案例,比如异地…...
阿里云短信服务与ASP.NET对接实例
准备工作 注册阿里云账号并开通阿里大于(现称"阿里云短信服务")服务 获取AccessKey ID和AccessKey Secret 申请短信签名和短信模板并审核通过 ASP.NET Web项目集成步骤 1. 安装阿里云SDK 通过NuGet包管理器安装阿里云短信服务SDK: Install-Package…...
【含文档+PPT+源码】基于微信小程序健康管理之健身房管理系统的设计与实现
课程目标: 教你从零开始部署运行项目,学习环境搭建、项目导入及部署,含项目源码、文档、数据库、软件等资料 课程简介: 本课程演示的是一款基于微信小程序健康管理之健身房管理系统的设计与实现,主要针对计算机相关…...
微信小程序转为App实践篇 FinClip
参考下面链接先 开始实践 微信小程序转为App并上架应用市场_微信小程序生成app-CSDN博客 首先在FinClip 官网上下载应用 小程序开发工具下载_小程序sdk下载资源-FinClip资源下载|泰坪小程序开放平台 下载到本地安装 打开导入自己的小程序项目;导入时会解析自己的…...
Qt/C++学习系列之QTreeWidget的简单使用记录
Qt/C学习系列之QTreeWidget的简单使用记录 前言1布局1.1布局要求1.2布局代码 2代码设计2.1整体勾选2.2勾选项确认 总结 前言 自己练手的项目中,需要对多个不同层级的选项进行勾选操作,而想到简洁点的操作方式就是使用QTreeWidget进行布局与应用。这里简…...
标易行项目redis内存中放哪些数据
结合你的项目经验,以下是 标易行投标服务平台 中 Redis 内存存储的核心数据类型及具体应用场景分析: 1. 用户订阅配置与实时推送 场景需求:用户订阅招标商机后,系统需实时推送符合订阅条件(如行业、区域、关键词)的标讯。Redis 存储数据: 订阅规则缓存:以 Hash 存储用户…...