Kafka 運維與調優篇:構建高可用生產環境的實戰指南

🛠? 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;換取后續持…