Oracle GoldenGate Kafka Connect Handler发送Kafka消息超时问题排查
问题现象
将Oracle GoldenGate for Big Data(Kafka Connect handler)与Docker部署的Confluent Kafka集成时,Handler启动正常,可读取trail文件且映射功能正常,但向Kafka发送消息时持续抛出超时错误:
=ERROR 2025-11-04 19:25:21.000317 [kafka-producer-network-thread | producer-1] - KAFKACONNECT-00052 A failure occurred sending the operation message at position [00000000000000003841] to Kafka to topic [GGRES.GG_TABLE]. org.apache.kafka.common.errors.TimeoutException: Expiring 14 record(s) for GGRES.GG_TABLE-0: 120000 ms has passed since batch creation
环境配置
- Docker Compose部署Confluent Platform 7.4.0/7.6.0:
- Kafka Broker:端口9092
- Kafka Connect:端口8083
- Schema Registry:端口8081
- Control Center:端口9021
- Oracle GoldenGate for Big Data部署在外部非Docker服务器
Kafka Broker配置片段
broker: image: confluentinc/cp-kafka:7.4.0 ports: - "9092:9092" environment: KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092' KAFKA_LISTENERS: 'PLAINTEXT://broker:29092,PLAINTEXT_HOST://0.0.0.0:9092' KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
GoldenGate Kafka Connect Handler配置
gg.handlerlist=kafkaconnect gg.handler.kafkaconnect.type=kafkaconnect gg.handler.kafkaconnect.kafkaProducerConfigFile=/u01/app/ogg23/ggdeploy/etc/conf/ogg/ora2kafka_producer.properties gg.handler.kafkaconnect.mode=op gg.handler.kafkaconnect.topicMappingTemplate=${fullyQualifiedTableName} gg.handler.kafkaconnect.keyMappingTemplate=${primaryKeys} gg.handler.kafkaconnect.messageFormatting=row gg.handler.kafkaconnect.java.home=/usr/lib/jvm/java-17-openjdk gg.classpath=/u01/app/ogg23/gghome/lib/kafka/* jvm.bootoptions=-Xmx512m -Xms32m
生产者配置文件(ora2kafka_producer.properties)
bootstrap.servers=IP_ADDRESS:9092 key.converter=io.confluent.connect.avro.AvroConverter key.converter.schema.registry.url=http://IP_ADDRESS:8081 value.converter=io.confluent.connect.avro.AvroConverter value.converter.schema.registry.url=http://IP_ADDRESS:8081
已完成的排查项
✅ Broker可达:
nc -vz IP_ADDRESS 9092 Connection succeeded
✅ 主题存在且可写入:
docker exec -it broker kafka-topics --bootstrap-server IP_ADDRESS:9092 --describe --topic GGRES.GG_TABLE
✅ 可手动生产消息:
echo "test" | kafka-console-producer --broker-list localhost:9092 --topic GGRES.GG_TABLE
✅ Schema Registry可达:
curl -s http://IP_ADDRESS:8081/subjects | jq . [ "GGRES.GG_TABLE-key", "GGRES.GG_TABLE-value" ]
但GoldenGate仍持续抛出超时错误:
=ERROR 2025-11-04 19:25:21.000318 [kafka-producer-network-thread | producer-1] - KAFKACONNECT-00052 A failure occurred sending the operation message at position [00000000000000004254] to Kafka to topic [GGRES.GG_TABLE]. org.apache.kafka.common.errors.TimeoutException: Expiring 14 record(s) for GGRES.GG_TABLE-0:120000 ms has passed since batch creation =ERROR 2025-11-04 19:25:21.000318 [kafka-producer-network-thread | producer-1] - KAFKACONNECT-00052 A failure occurred sending the operation message at position [00000000000000001734] to Kafka to topic [GGRES.GG_TABLE]. org.apache.kafka.common.errors.TimeoutException: Expiring 14 record(s) for GGRES.GG_TABLE-0:120000 ms has passed since batch creation Exception in thread "main" oracle.goldengate.util.GGException: Error detected handling transaction commit event. See the replicat RKAFKA.log file for more information. at oracle.goldengate.datasource.UserExitDataSource.commitTransaction(UserExitDataSource.java:2749) at oracle.goldengate.datasource.UserExitDataSource.commitTx(UserExitDataSource.java:2269)
环境信息
- Oracle GoldenGate for Big Data 23.x
- Confluent Platform 7.4.0 / Kafka Connect 7.6.0
- Java 17
- 运行环境:Linux(Docker + 外部OGG服务器)
疑问
- 为何Broker可达且手动生产消息正常的情况下,GoldenGate的Kafka Connect handler仍持续超时?
- 是否需要调整特定的Kafka Broker配置或handler的Java堆内存?
- Confluent 7.4.0(Kafka)与GoldenGate Kafka客户端(6.2.0 jars)版本不匹配是否会导致该问题?
问题解答
1. 超时核心原因
虽然nc能测试TCP连通性,但Kafka客户端与Broker的通信依赖Broker返回的可访问监听地址:
当前Broker配置的KAFKA_ADVERTISED_LISTENERS中,PLAINTEXT_HOST指向localhost:9092,外部OGG服务器的Kafka客户端连接Broker后,会收到这个localhost地址,而外部服务器无法将其解析到Docker内的Broker,导致实际数据传输连接失败,最终触发超时。
2. 配置调整方案
(1)修正Broker监听地址
修改Docker Compose中Broker的KAFKA_ADVERTISED_LISTENERS,将localhost替换为Docker宿主机的实际IP地址:
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://broker:29092,PLAINTEXT_HOST://宿主机实际IP:9092'
重启Broker后,客户端会获取到正确的外部可访问地址,解决通信链路问题。
(2)优化生产者参数
在ora2kafka_producer.properties中添加以下参数,优化超时策略和消息发送逻辑:
# 延长请求超时时间 request.timeout.ms=300000 # 延长元数据更新超时时间 metadata.max.age.ms=300000 # 调整批量大小和延迟,避免消息堆积过大 batch.size=16384 linger.ms=5
(3)调整Java堆内存
当前jvm.bootoptions设置的-Xmx512m可能不足以处理大事务或批量消息,建议调整为:
jvm.bootoptions=-Xmx1024m -Xms256m
避免内存不足导致的消息处理延迟。
3. 版本兼容性影响
Confluent 7.4.0对应Kafka 3.4.0,而GoldenGate自带的6.2.0 Kafka客户端对应Kafka 2.8.x,跨大版本的客户端与Broker确实可能存在兼容性问题:
- 优先查阅Oracle官方的GoldenGate for Big Data兼容性矩阵,确认支持的Kafka/Confluent版本;
- 若版本不兼容,可替换GoldenGate的Kafka客户端jar包为与Confluent 7.4.0匹配的版本(需同步替换kafka-clients、confluent-common等相关依赖jar)。
内容的提问来源于stack exchange,提问作者Mendbayar Alzakhgui

