🛠️ Kafka 运维与调优篇:构建高可用生产环境的实战指南

导语:在生产环境中,Kafka集群的稳定运行和高性能表现是业务成功的关键。本篇将深入探讨Kafka运维与调优的核心技术,从监控管理到性能优化,再到故障排查与容灾,为你构建企业级Kafka集群提供全方位的实战指南。


文章目录

  • 🛠️ Kafka 运维与调优篇:构建高可用生产环境的实战指南
    • 📊 集群监控与管理
      • 🔍 监控体系架构
      • 🎯 JMX 监控指标详解
      • 📈 Prometheus + Grafana 监控方案
      • 🎛️ Kafka Manager 可视化管理
    • ⚡ 性能调优
      • 🚀 生产者性能优化
      • 🎯 消费者性能优化
      • 🖥️ 系统层面调优
        • 磁盘优化
        • 网络优化
        • JVM调优
      • 📊 性能调优配置矩阵
    • 🚨 故障排查与容灾
      • 🔧 常见问题诊断
        • 1. 消息丢失问题
        • 2. 消费者延迟问题
      • 🛡️ 容灾策略
        • 1. 数据备份方案
        • 2. 集群故障恢复
      • 📱 监控告警体系
    • 🎯 总结与最佳实践
      • 核心要点回顾
      • 运维最佳实践
      • 技术发展趋势


📊 集群监控与管理

🔍 监控体系架构

在生产环境中,完善的监控体系是Kafka集群稳定运行的基石。我们需要构建多层次的监控架构:

在这里插入图片描述

🎯 JMX 监控指标详解

Kafka通过JMX暴露了丰富的监控指标,以下是核心监控指标的配置和使用:

public class KafkaJMXMonitor {private MBeanServerConnection mbeanConnection;// 核心监控指标private static final String[] BROKER_METRICS = {"kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec","kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec","kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec","kafka.network:type=RequestMetrics,name=RequestsPerSec,request=Produce","kafka.network:type=RequestMetrics,name=RequestsPerSec,request=FetchConsumer"};public void collectBrokerMetrics() {try {for (String metric : BROKER_METRICS) {ObjectName objectName = new ObjectName(metric);Object value = mbeanConnection.getAttribute(objectName, "OneMinuteRate");System.out.println(metric + ": " + value);}} catch (Exception e) {e.printStackTrace();}}// 监控消费者延迟public void monitorConsumerLag() {String consumerLagMetric = "kafka.consumer:type=consumer-fetch-manager-metrics,client-id=*";try {ObjectName objectName = new ObjectName(consumerLagMetric);Set<ObjectInstance> instances = mbeanConnection.queryMBeans(objectName, null);for (ObjectInstance instance : instances) {Object lag = mbeanConnection.getAttribute(instance.getObjectName(), "records-lag-max");System.out.println("Consumer Lag: " + lag);}} catch (Exception e) {e.printStackTrace();}}
}

📈 Prometheus + Grafana 监控方案

使用Prometheus收集Kafka指标,结合Grafana进行可视化展示:

global:scrape_interval: 15sscrape_configs:- job_name: 'kafka'static_configs:- targets: ['kafka-broker-1:9999', 'kafka-broker-2:9999', 'kafka-broker-3:9999']metrics_path: /metricsscrape_interval: 10s- job_name: 'kafka-exporter'static_configs:- targets: ['kafka-exporter:9308']
# 启动 Kafka JMX Exporter
java -javaagent:jmx_prometheus_javaagent-0.16.1.jar=9999:kafka-2_0_0.yml \-jar kafka_2.13-2.8.0.jar config/server.properties

🎛️ Kafka Manager 可视化管理

Kafka Manager提供了直观的Web界面来管理Kafka集群:

# 下载并启动 Kafka Manager
wget https://github.com/yahoo/CMAK/releases/download/3.0.0.5/cmak-3.0.0.5.zip
unzip cmak-3.0.0.5.zip
cd cmak-3.0.0.5
bin/cmak -Dconfig.file=conf/application.conf
# Kafka Manager 配置
kafka-manager.zkhosts="zk1:2181,zk2:2181,zk3:2181"
kafka-manager.base-zk-path="/kafka-manager"# 启用JMX监控
kafka-manager.consumer.properties.file="conf/consumer.properties"
kafka-manager.consumer.tuning.socket.receive.buffer.bytes=1048576

⚡ 性能调优

🚀 生产者性能优化

生产者的性能直接影响整个Kafka集群的吞吐量,以下是关键优化参数:

public class HighPerformanceProducer {public static Properties getOptimizedProducerConfig() {Properties props = new Properties();// 基础配置props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka1:9092,kafka2:9092,kafka3:9092");props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());// 性能优化配置props.put(ProducerConfig.BATCH_SIZE_CONFIG, 65536);           // 64KB批次大小props.put(ProducerConfig.LINGER_MS_CONFIG, 10);               // 等待10ms收集更多消息props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "lz4");     // 使用LZ4压缩props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 67108864);     // 64MB缓冲区// 可靠性与性能平衡props.put(ProducerConfig.ACKS_CONFIG, "1");                  // 等待leader确认props.put(ProducerConfig.RETRIES_CONFIG, 3);                 // 重试3次props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, 5);// 超时配置props.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG, 30000);props.put(ProducerConfig.DELIVERY_TIMEOUT_MS_CONFIG, 120000);return props;}// 异步发送优化public void sendMessagesAsync(KafkaProducer<String, String> producer, String topic, List<String> messages) {CountDownLatch latch = new CountDownLatch(messages.size());for (String message : messages) {ProducerRecord<String, String> record = new ProducerRecord<>(topic, message);producer.send(record, (metadata, exception) -> {if (exception != null) {System.err.println("发送失败: " + exception.getMessage());} else {System.out.println("发送成功: " + metadata.toString());}latch.countDown();});}try {latch.await(30, TimeUnit.SECONDS);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}
}

🎯 消费者性能优化

消费者的优化重点在于提高消费速度和减少延迟:

public class HighPerformanceConsumer {public static Properties getOptimizedConsumerConfig() {Properties props = new Properties();// 基础配置props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka1:9092,kafka2:9092,kafka3:9092");props.put(ConsumerConfig.GROUP_ID_CONFIG, "high-performance-group");props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());// 性能优化配置props.put(ConsumerConfig.FETCH_MIN_BYTES_CONFIG, 50000);      // 最小拉取50KBprops.put(ConsumerConfig.FETCH_MAX_WAIT_MS_CONFIG, 500);      // 最大等待500msprops.put(ConsumerConfig.MAX_PARTITION_FETCH_BYTES_CONFIG, 2097152); // 2MB分区拉取props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 1000);      // 每次拉取1000条// 会话管理props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 30000);props.put(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, 10000);props.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 300000);// 偏移量管理props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);   // 手动提交偏移量props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");return props;}// 批量处理消息public void consumeMessagesBatch(KafkaConsumer<String, String> consumer, String topic) {consumer.subscribe(Arrays.asList(topic));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));if (!records.isEmpty()) {// 批量处理消息List<String> messageBatch = new ArrayList<>();for (ConsumerRecord<String, String> record : records) {messageBatch.add(record.value());}// 处理批次processBatch(messageBatch);// 手动提交偏移量consumer.commitSync();}}}private void processBatch(List<String> messages) {// 批量处理逻辑System.out.println("处理批次消息数量: " + messages.size());}
}

🖥️ 系统层面调优

磁盘优化
# 文件系统优化
# 使用XFS文件系统,禁用atime
mount -o noatime,nodiratime /dev/sdb1 /kafka-logs# 调整磁盘调度器
echo noop > /sys/block/sdb/queue/scheduler# 增加文件描述符限制
echo "kafka soft nofile 100000" >> /etc/security/limits.conf
echo "kafka hard nofile 100000" >> /etc/security/limits.conf
网络优化
# 网络参数调优
echo 'net.core.rmem_default = 262144' >> /etc/sysctl.conf
echo 'net.core.rmem_max = 16777216' >> /etc/sysctl.conf
echo 'net.core.wmem_default = 262144' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 16777216' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_rmem = 4096 65536 16777216' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_wmem = 4096 65536 16777216' >> /etc/sysctl.confsysctl -p
JVM调优
# Kafka JVM 优化参数
export KAFKA_HEAP_OPTS="-Xmx6g -Xms6g"
export KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -Djava.awt.headless=true"
export KAFKA_GC_LOG_OPTS="-Xloggc:/var/log/kafka/kafkaServer-gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M"

📊 性能调优配置矩阵

场景吞吐量优先延迟优先平衡模式
batch.size65536102416384
linger.ms100010
compression.typelz4nonesnappy
acks11all
fetch.min.bytes100000150000
fetch.max.wait.ms50010100

🚨 故障排查与容灾

🔧 常见问题诊断

1. 消息丢失问题
public class MessageLossPrevention {// 防止消息丢失的生产者配置public static Properties getReliableProducerConfig() {Properties props = new Properties();props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka1:9092,kafka2:9092,kafka3:9092");// 关键配置防止消息丢失props.put(ProducerConfig.ACKS_CONFIG, "all");                 // 等待所有副本确认props.put(ProducerConfig.RETRIES_CONFIG, Integer.MAX_VALUE);  // 无限重试props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, 1); // 保证顺序props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true);    // 启用幂等性// 超时配置props.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG, 30000);props.put(ProducerConfig.DELIVERY_TIMEOUT_MS_CONFIG, 120000);return props;}// 消息发送确认机制public void sendWithConfirmation(KafkaProducer<String, String> producer, String topic, String message) {ProducerRecord<String, String> record = new ProducerRecord<>(topic, message);try {RecordMetadata metadata = producer.send(record).get(30, TimeUnit.SECONDS);System.out.println("消息发送成功: " + metadata.toString());} catch (Exception e) {System.err.println("消息发送失败: " + e.getMessage());// 实现重试逻辑或告警机制handleSendFailure(record, e);}}private void handleSendFailure(ProducerRecord<String, String> record, Exception e) {// 记录失败消息到死信队列或重试队列System.err.println("处理发送失败: " + record.value());}
}
2. 消费者延迟问题
public class ConsumerLagMonitor {public void monitorConsumerLag(String bootstrapServers, String groupId) {Properties props = new Properties();props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId + "-monitor");props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);try (AdminClient adminClient = AdminClient.create(props)) {// 获取消费者组信息DescribeConsumerGroupsResult groupResult = adminClient.describeConsumerGroups(Collections.singletonList(groupId));ConsumerGroupDescription groupDescription = groupResult.all().get().get(groupId);// 获取消费者偏移量ListConsumerGroupOffsetsResult offsetResult = adminClient.listConsumerGroupOffsets(groupId);Map<TopicPartition, OffsetAndMetadata> offsets = offsetResult.partitionsToOffsetAndMetadata().get();// 计算延迟for (Map.Entry<TopicPartition, OffsetAndMetadata> entry : offsets.entrySet()) {TopicPartition partition = entry.getKey();long consumerOffset = entry.getValue().offset();// 获取最新偏移量Map<TopicPartition, OffsetSpec> latestOffsetSpec = Collections.singletonMap(partition, OffsetSpec.latest());ListOffsetsResult latestResult = adminClient.listOffsets(latestOffsetSpec);long latestOffset = latestResult.all().get().get(partition).offset();long lag = latestOffset - consumerOffset;if (lag > 10000) { // 延迟超过10000条消息时告警System.err.println("高延迟告警: " + partition + ", 延迟: " + lag);sendAlert(partition, lag);}}} catch (Exception e) {e.printStackTrace();}}private void sendAlert(TopicPartition partition, long lag) {// 发送告警通知System.out.println("发送告警: 分区 " + partition + " 延迟 " + lag + " 条消息");}
}

🛡️ 容灾策略

1. 数据备份方案
#!/bin/bash# Kafka 数据备份脚本
BACKUP_DIR="/backup/kafka/$(date +%Y%m%d)"
KAFKA_LOG_DIR="/var/kafka-logs"
ZK_DATA_DIR="/var/zookeeper"# 创建备份目录
mkdir -p $BACKUP_DIR# 备份Kafka日志文件
echo "开始备份Kafka日志文件..."
tar -czf $BACKUP_DIR/kafka-logs-$(date +%H%M%S).tar.gz $KAFKA_LOG_DIR# 备份ZooKeeper数据
echo "开始备份ZooKeeper数据..."
tar -czf $BACKUP_DIR/zookeeper-data-$(date +%H%M%S).tar.gz $ZK_DATA_DIR# 导出Topic配置
echo "导出Topic配置..."
kafka-topics.sh --bootstrap-server localhost:9092 --list > $BACKUP_DIR/topics.listwhile read topic; dokafka-topics.sh --bootstrap-server localhost:9092 --describe --topic $topic > $BACKUP_DIR/topic-$topic.config
done < $BACKUP_DIR/topics.list# 清理7天前的备份
find /backup/kafka -type d -mtime +7 -exec rm -rf {} \;echo "备份完成: $BACKUP_DIR"
2. 集群故障恢复
public class ClusterRecovery {// 检查集群健康状态public boolean checkClusterHealth(String bootstrapServers) {Properties props = new Properties();props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);props.put(AdminClientConfig.REQUEST_TIMEOUT_MS_CONFIG, 10000);try (AdminClient adminClient = AdminClient.create(props)) {// 检查集群元数据DescribeClusterResult clusterResult = adminClient.describeCluster();Collection<Node> nodes = clusterResult.nodes().get(5, TimeUnit.SECONDS);System.out.println("集群节点数量: " + nodes.size());// 检查Topic状态ListTopicsResult topicsResult = adminClient.listTopics();Set<String> topics = topicsResult.names().get(5, TimeUnit.SECONDS);for (String topic : topics) {DescribeTopicsResult topicResult = adminClient.describeTopics(Collections.singletonList(topic));TopicDescription description = topicResult.all().get().get(topic);// 检查分区副本状态for (TopicPartitionInfo partition : description.partitions()) {if (partition.isr().size() < partition.replicas().size()) {System.err.println("分区副本不同步: " + topic + "-" + partition.partition());return false;}}}return true;} catch (Exception e) {System.err.println("集群健康检查失败: " + e.getMessage());return false;}}// 自动故障转移public void performFailover(String primaryCluster, String backupCluster) {if (!checkClusterHealth(primaryCluster)) {System.out.println("主集群故障,切换到备份集群...");// 更新客户端配置updateClientConfiguration(backupCluster);// 发送告警通知sendFailoverAlert(primaryCluster, backupCluster);}}private void updateClientConfiguration(String newBootstrapServers) {// 更新客户端配置逻辑System.out.println("更新客户端配置: " + newBootstrapServers);}private void sendFailoverAlert(String primary, String backup) {System.out.println("故障转移告警: 从 " + primary + " 切换到 " + backup);}
}

📱 监控告警体系

groups:- name: kafka-alertsrules:- alert: KafkaBrokerDownexpr: up{job="kafka"} == 0for: 1mlabels:severity: criticalannotations:summary: "Kafka broker is down"description: "Kafka broker {{ $labels.instance }} has been down for more than 1 minute."- alert: KafkaConsumerLagexpr: kafka_consumer_lag_sum > 10000for: 5mlabels:severity: warningannotations:summary: "High consumer lag detected"description: "Consumer group {{ $labels.group }} has lag of {{ $value }} messages."- alert: KafkaDiskUsageexpr: (kafka_log_size_bytes / kafka_log_size_limit_bytes) > 0.8for: 2mlabels:severity: warningannotations:summary: "Kafka disk usage high"description: "Kafka disk usage is {{ $value | humanizePercentage }} on {{ $labels.instance }}."

🎯 总结与最佳实践

核心要点回顾

  1. 监控体系:建立多层次监控,从应用层到基础设施层全覆盖
  2. 性能调优:根据业务场景选择合适的参数配置,平衡吞吐量和延迟
  3. 故障预防:通过合理的配置和监控,预防常见问题的发生
  4. 容灾准备:建立完善的备份和恢复机制,确保业务连续性

运维最佳实践

  • 渐进式优化:不要一次性修改所有参数,逐步调优并观察效果
  • 监控先行:在优化之前建立完善的监控体系
  • 文档记录:详细记录每次配置变更和效果
  • 定期演练:定期进行故障恢复演练,确保应急方案有效

技术发展趋势

  • 云原生化:Kafka在Kubernetes环境下的部署和管理
  • 自动化运维:基于AI的智能运维和自动调优
  • 边缘计算:Kafka在边缘环境下的轻量化部署

🤝关注我,获取更多技术干货!

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

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

相关文章

AR 地产互动沙盘:为地产沙盘带来变革​

在科技飞速发展的今天&#xff0c;AR&#xff08;增强现实&#xff09;技术应运而生&#xff0c;为解决传统地产沙盘的困境提供了全新的思路和方法。AR 技术&#xff0c;简单来说&#xff0c;是一种将计算机生成的虚拟信息与真实环境相融合的技术。它通过摄像头、传感器等设备获…

端到端自动驾驶系统关键技术

一、感知决策一体化模型架构 单一神经网络整合全流程 端到端神经网络能够直接将传感器输入映射为控制输出&#xff0c;消除了传统模块化架构中感知、规划、控制等独立模块之间的割裂。传统架构中&#xff0c;感知模块负责识别环境信息&#xff0c;决策模块根据感知结果进行路…

Vue Vue-route (2)

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue-route重定向和声明式导航 目录 Vue-route路由 重定向 首页默认访问 不存在匹配 声明式导航 路由原理 使用示例 自定义class类 Tag设置 版本4路由 改变 示例 总结 Vue-route路由 重定向 首页默认访问 希望访…

Mabl 基于云端的智能化自动化测试平台

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 </

Linux/Dog

Dog Enumeration nmap 第一次扫描发现系统对外开放了22、80端口&#xff0c;端口详细信息如下 ┌──(kali㉿kali)-[~/Desktop/vegetable/HTB] └─$ nmap -sC -sV -p 22,80 -oA nmap 10.10.11.58 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-26 03:36 EDT Nmap s…

青少年编程与数学 02-022 专业应用软件简介 01 设计与创意类软件:Adobe Creative Cloud

青少年编程与数学 02-022 专业应用软件简介 01 设计与创意类软件&#xff1a;Adobe Creative Cloud **一、Adobe公司介绍**&#xff08;一&#xff09;Adobe的创立与早期发展&#xff08;二&#xff09;Adobe的市场地位与影响力&#xff08;三&#xff09;Adobe的创新文化 **二…

【亚马逊防关联攻略】多店铺运营如何做好环境隔离?

在亚马逊跨境电商中&#xff0c;多店运营的最大风险是账号关联。亚马逊规定&#xff0c;同一卖家在同一站点只能拥有一个店铺。平台会通过多种方式追踪注册信息、设备和网络环境等&#xff0c;如果发现关联因素&#xff0c;所有关联账号可能被批量封禁&#xff0c;这会导致资金…

She‘s Coming !

#好书推荐《一本书讲透汽车功能安全&#xff1a;标准详解与应用实践》 #功能安全应用指南 #功能安全实践参考宝典 Finally, shes coming ! 她来得有点晚&#xff0c;但 “好饭不怕晚”。 她就是刚出炉的新书《一本书讲透汽车功能安全&#xff1a;标准详解与应用实践》 京东…

如何用废弃电脑变成服务器搭建web网站(公网访问零成本)

文章目录 &#x1f4bb; 如何用废弃电脑变成服务器搭建 Web 网站&#xff08;公网访问零成本&#xff09;一、背景与目标✅ 本文目标&#xff1a; 二、准备工作&#xff08;软硬件需求&#xff09;&#x1f9f1; 1. 硬件需求&#x1f9f0; 2. 软件环境准备 三、快速搭建一个 Fl…

〔从零搭建〕指标体系平台部署指南

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨杭州奥零数据科技官网&#xf…

Vue3 中watch和computed

Vue 3 中 computed 与 watch 深度解析 在 Vue 3 组合中&#xff0c;响应式工具的类型安全使用至关重要。以下是详细说明 一、watch 侦听器 1. 基础类型监听 <template><div>实际参数1{{count}}</div><div><button click"count">点…

.NET测试工具Parasoft dotTEST:全兼容RMS的测试解决方案

随着项目规模扩大&#xff0c;需求管理变得复杂&#xff0c;如何高效追溯需求与测试的关联性成为一大挑战。Parasoft dotTEST 提供了一套强大的需求追溯解决方案&#xff0c;不仅能自动关联单元测试结果与需求&#xff0c;还能兼容几乎所有需求管理系统&#xff08;RMS&#xf…

基于Jeecgboot3.8.1的vue3版本前后端分离的flowable流程管理平台

初步迁移完成了基于jeecgboot3.8.1的vue3版本的前后端流程管理平台,基于flowable6.8.0,同时支持bpmn流程设计器与仿钉钉流程设计器。 功能类似于3.6.3,但增加了一些以下功能: 1、支持多租户 2、支持并行网关的任意跳转、退回与驳回 3、流程表达式 这里流程表达式定义四…

IP 限流 vs. URI 限流

背景&#xff1a; 昨天调程序的时候遇到了一个 BUG&#xff0c;前端无法将文件正确传给后端&#xff0c;后端报错 EOFException&#xff08;EOF 代表 End Of File&#xff09;就是在程序尝试从一个数据流中读取数据时&#xff0c;发现已经到达了数据流的末尾&#xff0c;但它却…

2025年Java常见面试题(持续更新)

数据库事务特性。原子性、一致性、隔离性、持久性如何防止SQL注入&#xff1a;使用#不要使用$符号&#xff1b;对所有的入参做校验&#xff1b;使用存储过程&#xff1b;执行预处理语句和参数化查询&#xff1b;最低权限原则&#xff1b;微服务拆分的原则&#xff1a;微服务的拆…

Spring AI ——在springboot应用中实现基本聊天功能(ChatModel)

文章目录 前言项目版本依赖引入配置key信息编写测试接口注入ChatModel并普通返回注入ChatModel并流式返回自定义模型对象并直接返回总结前言 在Spring AI 中,CchatClient 是一个所有大模型通用性的调用方式,对绝大多数大模型的功能点都具备封装和见解调用性。 但这一点在部…

78、系统工程生命周期阶段及方法

一、系统工程生命周期的七大阶段 系统工程生命周期涵盖从概念萌芽到系统退役的全过程&#xff0c;通常分为以下七个阶段&#xff0c;每个阶段具有明确目标与核心任务&#xff1a; 1.探索性研究阶段 目标&#xff1a;识别利益相关者需求&#xff0c;探索技术可行性。任务&…

二十九、【用户体验篇】个人中心:用户资料展示与密码修改

二十九、【用户体验篇】个人中心:用户资料展示与密码修改 前言准备工作第一部分:后端实现 - 个人中心 API1. 修改 `UserDetailSerializer` 以支持密码修改2. 在 `api/views.py` 中添加 `UserMeView` 和 `PasswordChangeView`3. 注册个人中心相关 API 路由4. 后端初步测试第二…

STEP-BACK PROMPTING:退一步:通过抽象在大型语言模型中唤起推理能力

摘要 我们提出了 STEP-BACK PROMPTING&#xff0c;这是一种简单的提示技术&#xff0c;可以让LLM进行抽象&#xff0c;从包含具体细节的实例中推导出高层次概念和第一性原理。利用这些概念和原理来引导推理过程&#xff0c;LLM在朝向正确解答路径上显著提升了推理能力。我们在…

Paimon vs. HBase:全链路开销对比

Paimon 在特定场景&#xff08;如流式 Lookup Join&#xff09;下&#xff0c;会为了极致的查询性能而引入额外的存储&#xff08;本地磁盘 LookupFile&#xff09;和计算&#xff08;构建 LookupFile&#xff09;开销。但这是一种用一次性的、可控的开销&#xff0c;换取后续持…