当前位置: 首页 > news >正文

Kafka 的重平衡问题详解及解决方案

引言

Kafka 是目前非常流行的分布式消息队列系统,被广泛应用于流数据处理、日志分析、事件驱动架构等场景中。Kafka 的高吞吐量和分布式架构在应对海量数据传输方面具有显著优势。然而,Kafka 在处理消费者组时,会面临一个核心问题——重平衡(Rebalance)。重平衡是 Kafka 保持高可用性和分区数据均衡的关键机制,但在某些情况下,重平衡也可能带来性能问题和延迟。

本文将详细介绍 Kafka 的重平衡机制,分析重平衡的触发条件、重平衡过程的详细步骤以及在重平衡过程中可能出现的问题,并提供优化建议。通过图文及代码示例,帮助开发者深入理解 Kafka 的重平衡机制及其优化方法。


第一部分:什么是 Kafka 的重平衡?

1.1 重平衡的定义

重平衡(Rebalance) 是 Kafka 在消费者组内部重新分配分区(Partition)的过程。Kafka 的消费者组是一个逻辑概念,它允许多个消费者实例(Consumer)共同消费一个或多个主题(Topic)的分区。每个分区只能被一个消费者组中的一个消费者消费。因此,重平衡的目的是确保分区在消费者组中的消费者之间合理分配。

1.2 为什么需要重平衡?

Kafka 的消费者组在以下情况下需要进行重平衡:

  1. 消费者加入或离开消费者组:当消费者组中的消费者增减时,需要重新分配分区以平衡负载。例如,一个新的消费者加入后,原有的消费者可能需要释放部分分区以供新消费者使用。
  2. 消费者失效:当某个消费者因为网络、系统崩溃等原因失效时,Kafka 必须将其负责的分区重新分配给其他存活的消费者。
  3. 主题的分区数量发生变化:当 Kafka 的某个主题新增分区时,需要通过重平衡将这些新分区分配给消费者组中的消费者。
1.3 重平衡的触发条件

Kafka 重平衡的触发条件主要有以下几种:

  • 消费者组中有消费者加入或离开:例如,某个消费者故障退出或新增消费者实例。
  • 分区分配器策略变更:Kafka 提供了多种分区分配策略,如 Range、RoundRobin 等,策略改变后会触发重平衡。
  • 主题分区数量增加:分区增加后,需要重平衡将新分区分配给消费者。

第二部分:Kafka 重平衡的过程

Kafka 的重平衡过程是自动触发的,并由 Kafka 的消费者协调器(Consumer Coordinator)来管理。下面我们将详细讲解 Kafka 重平衡的完整流程。

2.1 重平衡的触发
  1. 消费者组变更检测:Kafka 的消费者组协调器会定期检查消费者组的状态,当消费者组中的消费者加入或离开时,会通知组中的消费者进行重平衡。
  2. 协调者发出重平衡请求:消费者组的协调者在检测到组的变更后,向所有消费者发出重平衡的通知,要求消费者停止消费,进入重平衡状态。
2.2 停止消费

一旦重平衡触发,消费者必须立即停止消费当前正在处理的分区。Kafka 会通过心跳机制让消费者检测到重平衡的开始,消费者会暂停消费任务,并将当前消费的偏移量(offset)提交给协调器。

// 消费者代码:重平衡监听器
public class MyRebalanceListener implements ConsumerRebalanceListener {@Overridepublic void onPartitionsRevoked(Collection<TopicPartition> partitions) {System.out.println("Partitions revoked: " + partitions);// 在重平衡期间提交偏移量,确保没有数据丢失consumer.commitSync();}@Overridepublic void onPartitionsAssigned(Collection<TopicPartition> partitions) {System.out.println("Partitions assigned: " + partitions);}
}
2.3 分配分区

在消费者停止消费之后,Kafka 协调者会根据消费者组的分区分配策略(如 Range、RoundRobin 等)重新计算分区的分配方案,将分区均匀分配给组内的消费者。常见的分区分配策略包括:

  • Range 分配:按照分区顺序均匀分配,通常会导致部分消费者处理较多的分区。
  • RoundRobin 分配:将分区轮询分配给消费者,确保每个消费者接收的分区数尽量接近。

示意图:Range 分配与 RoundRobin 分配

Range 分配:
消费者1: 分区1, 分区2
消费者2: 分区3, 分区4RoundRobin 分配:
消费者1: 分区1, 分区3
消费者2: 分区2, 分区4
2.4 重新开始消费

一旦分区分配完成,Kafka 协调者会通知消费者组中的所有消费者新的分区分配方案。消费者将根据新的分配结果重新开始消费分配到的分区。在此过程中,消费者会从上一次提交的偏移量开始继续消费,以确保数据不会丢失。

// 消费者代码:重平衡完成后的操作
public class MyRebalanceListener implements ConsumerRebalanceListener {@Overridepublic void onPartitionsAssigned(Collection<TopicPartition> partitions) {for (TopicPartition partition : partitions) {// 从最新的偏移量开始消费consumer.seek(partition, consumer.position(partition));}}
}
2.5 重平衡的完成

当所有消费者成功接收到新的分配结果并开始消费时,Kafka 的重平衡过程完成。此时,Kafka 重新进入正常的消息消费流程。


第三部分:重平衡过程中的常见问题

尽管 Kafka 的重平衡机制能够确保分区的合理分配,但在高并发或复杂场景下,重平衡过程可能会引发一些问题,影响系统的性能和稳定性。

3.1 重平衡导致的消费中断

在重平衡过程中,消费者必须停止消费并等待分区重新分配,这可能导致消费延迟或中断。尤其是在重平衡频繁发生的场景下,消费者可能长时间处于停滞状态,无法及时处理消息。

示例:频繁重平衡导致的延迟

消费者1 离开消费者组 -> 重平衡触发 -> 消费者2 暂停消费 -> 分配新分区 -> 消费者2 重新开始消费

解决方案

  1. 减少消费者的波动:尽量减少消费者的频繁加入或退出,可以通过优化部署策略来减少重平衡的触发。
  2. 优化心跳配置:调整 session.timeout.msheartbeat.interval.ms 参数,以减少因心跳超时引发的重平衡。
3.2 分区分配不均衡

在某些情况下,Kafka 的分区分配策略可能会导致分配不均衡,某些消费者可能会处理更多的分区,从而导致负载不均衡。例如,使用 Range 分配策略时,最后一个消费者可能会处理更多的分区。

示例:分配不均衡问题

消费者1: 分区1, 分区2
消费者2: 分区3, 分区4, 分区5  -> 消费者2 处理更多分区

解决方案

  1. 使用 RoundRobin 分配策略:RoundRobin 可以更均匀地分配分区,减少消费者之间的负载差异。
  2. 自定义分区分配策略:开发者可以根据业务需求实现自定义的分区分配策略,确保分区更加均匀。
// 使用 RoundRobin 分配策略
Properties props = new Properties();
props.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, "org.apache.kafka.clients.consumer.RoundRobinAssignor");
3.3 重平衡频繁触发

在高并发的环境下,如果消费者频繁加入或离开消费者组,或者由于网络问题导致消费者心跳超时,Kafka 的重平衡可能会被频繁触发。这会导致消费者组频繁停止消费,影响消息的处理效率。

解决方案

  1. 调整消费者心跳参数:通过增加 session.timeout.msheartbeat.interval.ms 的时间,可以减少因心跳超时导致的重平衡。
  2. 稳定的消费者部署:确保消费者实例的稳定性,减少由于实例故障或网络抖动引发的重平衡。
3.4 重平衡期间的消息丢失或重复消费

在重平衡过程中,如果消费者没有及时提交消费偏移量,可能

会导致消息的丢失或重复消费。消费者在重平衡之前没有提交的偏移量会在重平衡后失效,导致 Kafka 认为消息没有被处理过,从而再次分配给其他消费者进行处理。

解决方案

  1. 及时提交偏移量:确保消费者在重平衡前正确提交偏移量,可以使用手动提交来保证偏移量的准确性。
  2. 使用幂等性机制:在业务逻辑中实现幂等性操作,确保即使消息被重复处理,最终结果也是正确的。
// 手动提交偏移量
consumer.commitSync();

第四部分:Kafka 重平衡的优化策略

为了避免重平衡带来的负面影响,提高 Kafka 系统的稳定性和性能,以下是一些优化 Kafka 重平衡的建议和策略。

4.1 减少重平衡的触发频率

频繁的重平衡可能导致消费者长时间停滞,影响系统的吞吐量。减少重平衡的触发频率可以显著提升 Kafka 的性能。

  • 优化消费者部署:避免频繁地启动和停止消费者实例,保持消费者的稳定性。
  • 增加心跳超时时间:适当增加 session.timeout.msheartbeat.interval.ms 的时间,可以减少因为心跳超时导致的重平衡。
// 优化心跳参数
Properties props = new Properties();
props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "30000");  // 30秒的会话超时时间
props.put(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, "10000");  // 10秒的心跳间隔
4.2 使用自定义的分区分配策略

Kafka 提供了多种分区分配策略,但在某些业务场景中,开发者可以根据需求实现自定义的分区分配策略,确保分区分配的灵活性和均衡性。

// 实现自定义分区分配策略
public class CustomPartitionAssignor implements PartitionAssignor {@Overridepublic String name() {return "custom-partition-assignor";}@Overridepublic Map<String, List<TopicPartition>> assign(Cluster cluster, Map<String, ConsumerGroupMetadata> groupMetadata, Map<String, List<TopicPartition>> partitionsPerConsumer) {// 自定义分区分配逻辑}
}
4.3 优化分区数和消费者数的匹配

Kafka 的分区数与消费者数量直接影响重平衡的性能。如果分区数与消费者数量不匹配,可能会导致分区分配不均衡或重平衡延迟。因此,优化分区数与消费者数量的匹配关系可以提升重平衡的效率。

  • 消费者数量不应超过分区数:如果消费者数超过分区数,某些消费者将无法分配到分区,从而浪费资源。
  • 分区数应尽量为消费者数的倍数:确保每个消费者可以均匀分配到分区。
4.4 使用消费者组管理工具

Kafka 提供了一些消费者组管理工具,帮助开发者监控和管理消费者组的状态。通过这些工具,可以实时监控消费者组的状态,检测重平衡问题,并采取相应的优化措施。

# 查看消费者组状态
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group my-consumer-group

第五部分:Kafka 重平衡的代码示例

以下是一个完整的代码示例,展示了如何使用 Kafka 消费者组并处理重平衡。

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.clients.consumer.ConsumerRebalanceListener;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.common.TopicPartition;import java.util.Arrays;
import java.util.Properties;
import java.util.Collection;public class KafkaRebalanceExample {public static void main(String[] args) {Properties props = new Properties();props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");props.put(ConsumerConfig.GROUP_ID_CONFIG, "my-consumer-group");props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);consumer.subscribe(Arrays.asList("my-topic"), new MyRebalanceListener(consumer));while (true) {ConsumerRecords<String, String> records = consumer.poll(1000);for (ConsumerRecord<String, String> record : records) {System.out.printf("Consumed record with key %s and value %s%n", record.key(), record.value());// 处理消息}consumer.commitSync();  // 手动提交偏移量}}
}class MyRebalanceListener implements ConsumerRebalanceListener {private KafkaConsumer<String, String> consumer;public MyRebalanceListener(KafkaConsumer<String, String> consumer) {this.consumer = consumer;}@Overridepublic void onPartitionsRevoked(Collection<TopicPartition> partitions) {System.out.println("Partitions revoked: " + partitions);consumer.commitSync();  // 提交偏移量,避免重平衡导致消息丢失}@Overridepublic void onPartitionsAssigned(Collection<TopicPartition> partitions) {System.out.println("Partitions assigned: " + partitions);}
}

第六部分:总结与展望

6.1 总结

Kafka 的重平衡机制是消费者组中不可避免的一部分,通过重平衡,Kafka 可以动态调整分区分配,确保消费者组的高可用性和负载均衡。然而,频繁的重平衡可能导致性能问题、延迟甚至消息丢失。因此,理解 Kafka 重平衡的触发条件和过程,并针对重平衡问题进行优化,是保障 Kafka 系统高效稳定运行的关键。

本文详细介绍了 Kafka 重平衡的工作原理,重平衡的触发条件、分区分配策略、常见问题及优化建议。通过代码示例,开发者可以更好地理解如何管理 Kafka 重平衡过程中的各个环节,减少重平衡带来的负面影响。

6.2 展望

随着分布式系统的发展,Kafka 在处理高并发、海量数据传输时表现优异。未来,Kafka 可能会进一步优化其重平衡机制,引入更加灵活、智能的分区分配算法,减少重平衡带来的性能损耗。开发者应持续关注 Kafka 的新特性和优化方案,提升系统的稳定性和性能。

相关文章:

Kafka 的重平衡问题详解及解决方案

引言 Kafka 是目前非常流行的分布式消息队列系统&#xff0c;被广泛应用于流数据处理、日志分析、事件驱动架构等场景中。Kafka 的高吞吐量和分布式架构在应对海量数据传输方面具有显著优势。然而&#xff0c;Kafka 在处理消费者组时&#xff0c;会面临一个核心问题——重平衡…...

比较GPT4比较正确的回复的提问方式和比较失败的提问方式之间的区别?

比较GPT4比较正确的回复的提问方式和比较失败的提问方式之间的区别&#xff1f; 正确提问失败提问异同 正确提问 ####一堆python源码############# 这里如何根据数据是新建还是更新来调用不同的save方法&#xff1f; 失败提问 ####一堆python源码############# 为什么在修改…...

jmeter学习(1)线程组与发送请求

1、线程组 执行顺序 &#xff1a;setUp线程组 > 线程组 > tearDown线程组 2、 发送请求 可以发送http、java、dubbo 请求等 下面讲解发送http 1&#xff09;Http请求默认值 作用范围是该线程组下的所有HTTP请求&#xff0c;如果http请求设置的与默认值冲突&#xff0…...

【小技巧】mysql 判断表字段是否存在 删除字段 sql脚本

MySQL 判断表字段是否存在 删除字段 sql脚本 下面是一个包含插入和更新操作的流程&#xff1a; -- 先尝试插入数据 INSERT IGNORE INTO user_info (last_name, first_name) VALUES (x, y);-- 如果插入成功&#xff0c;ROW_COUNT() 返回 1&#xff0c;否则返回 0 IF ROW_COUNT…...

低代码革命:重塑工业互联网的未来版图

在数字化转型的浪潮中&#xff0c;低代码应用正以前所未有的速度席卷各行各业&#xff0c;尤其是在工业互联网领域&#xff0c;它正悄然改变着企业的技术架构和业务模式。本文将深入探讨低代码应用如何成为工业互联网的技术趋势&#xff0c;并展望其未来的辉煌前景&#xff0c;…...

KNN算法

KNN算法 一 KNN算法介绍二 KNN算法API2.1 KNeighborsClassifier 分类算法2.2 KNeighborsRegressor 回归算法 三 两个经典案例3.1 鸢尾花案例3.2 手写数字识别案例 一 KNN算法介绍 K-近邻算法&#xff08;K Nearest Neighbor&#xff0c;简称KNN&#xff09;.比如根据你的“邻居…...

TS 中类型的继承

在 TypeScript&#xff08;TS&#xff09;中&#xff0c;类型的继承通常通过接口&#xff08;Interfaces&#xff09;和类&#xff08;Classes&#xff09;来实现。接口提供了一种定义对象形状的方式&#xff0c;而类则提供了一种创建对象实例的方式。以下是如何在 TypeScript …...

在VS code 中部署C#和avalonia开发环境

要在 Mac 的 VS Code 中配置 C# 和 Avalonia 的开发环境&#xff0c;您可以按照以下步骤进行&#xff1a; 1. 安装 .NET SDK 下载 .NET SDK&#xff1a; 访问 .NET 下载页面。选择适用于 macOS 的最新稳定版本的 .NET SDK&#xff0c;并下载安装程序。安装 .NET SDK&#xff1…...

Windows删除service服务

Windows删除service服务 找到命令提示符&#xff1a; 右键&#xff0c;以管理员身份运行 输入&#xff1a; sc delete 服务名 Windows根据TCP端口号查找进程PID再kill进程_windows tcpkill-CSDN博客文章浏览阅读5.3k次&#xff0c;点赞42次&#xff0c;收藏104次。Windows根据…...

【数据结构】---图

图 前言 本篇作为图的基础概念篇&#xff0c; 了解图的离散数学定义&#xff0c; 图的分类&#xff0c; 图模型解决的问题&#xff08;图的应用&#xff09;&#xff0c; 图的相关算法&#xff08;仅仅介绍&#xff0c;具体不在此篇展开&#xff09;。 学习基本路线&#xff…...

《 C++ 修炼全景指南:十四 》大数据杀手锏:揭秘 C++ 中 BitSet 与 BloomFilter 的神奇性能!

本篇博客深入探讨了 C 中的两种重要数据结构——BitSet 和 BloomFilter。我们首先介绍了它们的基本概念和使用场景&#xff0c;然后详细分析了它们的实现方法&#xff0c;包括高效接口设计和性能优化策略。接着&#xff0c;我们通过对比这两种数据结构的性能&#xff0c;探讨了…...

相机基础概念

景深&#xff1a; 景深的定义 DOF:depth of filed 是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。光圈、镜头、及焦平面到拍摄物的距离是影响景深的重要因素。定义3&#xff1a;在镜头前方&#xff08;焦点的前、后&#xff09;有一…...

【python】追加写入excel

输出文件运行前&#xff08;有两张表&#xff0c;“表1”和“Sheet1”&#xff09;&#xff1a; 目录 一&#xff1a;写入单表&#xff08;删除所有旧工作表&#xff0c;写入新表&#xff09;二&#xff1a;写入多表&#xff08;删除所有旧工作表&#xff0c;写入新表&#x…...

继承实现单例模式的探索(二)

前言 本篇文章继续探索通过继承实现单例模式的可行方案&#xff0c;这次的方案将采用反射机制隐式创建派生类实例&#xff0c;示例代码为C#。 代码 v1.0 using System.Reflection;/// <summary> /// 单例模式基类 /// </summary> /// <typeparam name"T&…...

设计模式-访问者模式

访问者模式&#xff08;Visitor&#xff09;:表示一个作用于某对象结构中的各元素的操作&#xff0c;使得在不改变个元素的类的前提下定义作用于这些元素的新操作。...

国创——基于Unity3D和MediaPipe构建虚拟人物驱动系统

以下是一个基于Unity3D和MediaPipe构建虚拟人物驱动系统的基本概念和简化的Python示例代码框架。请注意&#xff0c;这只是一个基础示例&#xff0c;实际应用中可能需要更多的完善和调整。 一、整体概念 1. MediaPipe - MediaPipe是一个用于构建多模态&#xff08;例如视频、…...

环境可靠性

一、基础知识 1.1 可靠性定义 可靠性是指产品在规定的条件下、在规定的时间内完成规定的功能的能力。 可靠性的三大要素&#xff1a;耐久性、可维修性、设计可靠性 耐久性&#xff1a;指的是产品能够持续使用而不会故障的特性&#xff0c;或者说是产品的使用寿命。 可维修性&a…...

Chromium 设置页面打开系统代理源码分析c++

1、前端页面调用showProxySettings() {chrome.send("showProxySettings")} 2、c 响应代码如下 chrome\browser\ui\webui\settings\system_handler.ccvoid SystemHandler::RegisterMessages() {web_ui()->RegisterMessageCallback("showProxySettings",b…...

信号检测理论(Signal Detection Theory, SDT)

信号检测理论&#xff08;Signal Detection Theory, SDT&#xff09;模拟是一种实验设计&#xff0c;用于研究和理解在存在噪声或不确定性的情况下如何做出决策。在心理学、认知科学、工程学和许多其他领域&#xff0c;信号检测理论都非常重要。 一、基础概念&#xff1a; 在信…...

Flink源码剖析

写在前面 最近一段时间都没有更新博客了&#xff0c;原因有点离谱&#xff0c;在实现flink的两阶段提交的时候&#xff0c;每次执行自定义的notifyCheckpointComplete时候&#xff0c;好像就会停止消费数据&#xff0c;完成notifyComplete后再消费数据&#xff1b;基于上述原因…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...

21-Oracle 23 ai-Automatic SQL Plan Management(SPM)

小伙伴们&#xff0c;有没有迁移数据库完毕后或是突然某一天在同一个实例上同样的SQL&#xff0c; 性能不一样了、业务反馈卡顿、业务超时等各种匪夷所思的现状。 于是SPM定位开始&#xff0c;OCM考试中SPM必考。 其他的AWR、ASH、SQLHC、SQLT、SQL profile等换作下一个话题…...