🚀 RocketMQ Connect 详解:构建数据管道的桥梁
RocketMQ Connect 是 Apache RocketMQ 生态中的 数据集成组件,用于在 RocketMQ 与其他系统(如数据库、文件、Kafka、Elasticsearch 等)之间可靠地传输数据,无需编写代码即可实现数据的导入(Source)和导出(Sink)。
它借鉴了 Kafka Connect 的设计理念,提供了一套可扩展、高吞吐、容错性强的数据管道框架。
一、什么是 RocketMQ Connect?
✅ 定义:
RocketMQ Connect 是一个分布式、可扩展、容错的数据集成框架,用于:
- 将外部数据源(如 MySQL、PostgreSQL)的数据实时同步到 RocketMQ(Source Connector)
- 将 RocketMQ 中的消息实时写入外部系统(如 Elasticsearch、HBase、Kafka)(Sink Connector)
📌 类比:ETL 工具 + 消息桥接器。
二、核心架构
+----------------+ +---------------------+ +------------------+
| Data Source |--> | Source Connector |--> | RocketMQ |
| (MySQL, File) | | (数据抽取) | | (消息中间件) |
+----------------+ +---------------------+ +------------------+
↓
+----------------+ +---------------------+ +------------------+
| Data Sink |<-- | Sink Connector |<-- | |
| (ES, Kafka) | | (数据写入) | | |
+----------------+ +---------------------+ +------------------+
🔧 核心组件:
| 组件 | 说明 |
|---|---|
| Connect Worker | 运行 Connector 和 Task 的进程,负责任务调度与状态管理 |
| Connector | 逻辑组件,定义如何连接外部系统(如 MySQLSourceConnector) |
| Task | 实际执行数据读写的工作单元,支持并行 |
| Converter | 数据格式转换器(JSON、Avro、String 等) |
| Offset Storage | 存储数据同步的偏移量,保证不重复、不丢失 |
| REST API | 用于提交、管理 Connector 任务 |
三、核心概念详解
1. Connector(连接器)
- 是一个逻辑插件,定义了如何连接某个外部系统
- 分为两类:
- Source Connector:从外部系统读取数据,发送到 RocketMQ
- Sink Connector:从 RocketMQ 消费消息,写入外部系统
📌 示例:
# MySQL Source Connector
MySQL → Binlog → RocketMQ
# Elasticsearch Sink Connector
RocketMQ → ES Document → Elasticsearch
2. Task(任务)
- Connector 被拆分为多个 Task 并行执行
- 提升吞吐量,支持负载均衡
📌 示例:
- 一个 MySQL Source Connector 可以拆分为多个 Task,每个 Task 同步一张表
- 一个 Kafka Sink Connector 可以并行写入多个 Kafka Partition
3. Converter(转换器)
- 负责在 外部数据格式 ↔ RocketMQ 消息 之间转换
- 支持:
JsonConverterStringConverterAvroConverter(需 Schema Registry)
📌 示例:
// MySQL 行数据
{"id": 1001, "name": "张三", "age": 30}
↓ Converter
Message Body: {"id":1001,"name":"张三","age":30}
Message Topic: user_info
4. Offset Storage(偏移量存储)
- 记录每个 Task 的同步进度(如 MySQL Binlog 位点、文件行号)
- 保证 Exactly-Once 或 At-Least-Once 语义
- 存储在 RocketMQ 的特殊 Topic 中(如
__connect_offsets)
✅ 故障恢复后,从上次 Offset 继续同步,避免重复或丢失。
四、工作流程
1. 用户通过 REST API 提交 Connector 配置
↓
2. Connect Worker 解析配置,创建 Connector 实例
↓
3. Connector 拆分为多个 Task
↓
4. Task 启动:
- Source Task:从外部系统读取数据 → 转换 → 发送到 RocketMQ
- Sink Task:从 RocketMQ 消费消息 → 转换 → 写入外部系统
↓
5. 周期性提交 Offset
↓
6. 故障时自动恢复(从 Offset 继续)
五、部署模式
1. Standalone 模式(单机)
- 所有组件运行在一个 JVM 中
- 适用于开发测试
sh bin/connect-standalone.sh config/connect-standalone.properties config/mysql-source.properties
2. Distributed 模式(分布式,推荐)
- 多个 Connect Worker 组成集群
- 支持高可用、负载均衡、动态扩缩容
# 启动多个 Worker
sh bin/connect-distributed.sh config/connect-distributed.properties
- 通过 REST API 提交任务,集群自动分配 Task
六、REST API 使用示例
1. 创建 Source Connector
curl -X POST http://localhost:8083/connectors \
-H "Content-Type: application/json" \
-d '{
"name": "mysql-source-connector",
"config": {
"connector.class": "org.apache.rocketmq.connect.runtime.connectorwrapper.JdbcSourceConnector",
"task.max": "1",
"database.hostname": "192.168.0.10",
"database.port": "3306",
"database.user": "root",
"database.password": "123456",
"database.dbname": "test",
"table.whitelist": "users",
"topic.prefix": "db_",
"database.history.rocketmq.topic": "schema-changes"
}
}'
2. 创建 Sink Connector
curl -X POST http://localhost:8083/connectors \
-H "Content-Type: application/json" \
-d '{
"name": "es-sink-connector",
"config": {
"connector.class": "org.apache.rocketmq.connect.runtime.connectorwrapper.ElasticsearchSinkConnector",
"task.max": "1",
"topics": "user_info",
"connection.url": "http://192.168.0.20:9200",
"type.name": "_doc",
"key.ignore": "true"
}
}'
3. 查看 Connector 状态
curl http://localhost:8083/connectors
curl http://localhost:8083/connectors/mysql-source-connector/status
七、内置 Connector(官方支持)
| 类型 | Connector 名称 | 说明 |
|---|---|---|
| Source | JdbcSourceConnector | 从 MySQL、PostgreSQL 等数据库同步 |
| Source | FileStreamSourceConnector | 从文件读取数据 |
| Sink | FileStreamSinkConnector | 写入文件 |
| Sink | ElasticsearchSinkConnector | 写入 ES |
| Sink | KafkaSinkConnector | 写入 Kafka |
| Sink | HBaseSinkConnector | 写入 HBase |
📦 社区还提供 Redis、MongoDB、Oracle 等第三方 Connector。
八、自定义 Connector 开发
1. 实现 SourceConnector
public class MySourceConnector extends SourceConnector {
@Override
public Class<? extends Task> taskClass() {
return MySourceTask.class;
}
@Override
public List<Map<String, String>> taskConfigs(int maxTasks) {
List<Map<String, String>> configs = new ArrayList<>();
for (int i = 0; i < maxTasks; i++) {
configs.add(configs());
}
return configs;
}
@Override
public ConfigDef config() {
return MySourceConnectorConfig.CONFIG_DEF;
}
}
2. 实现 SourceTask
public class MySourceTask extends SourceTask {
@Override
public List<SourceRecord> poll() throws InterruptedException {
// 从外部系统读取数据
List<SourceRecord> records = new ArrayList<>();
records.add(new SourceRecord(
sourcePartition(), // 分区标识
sourceOffset(), // 偏移量
"topic_name", // RocketMQ Topic
Schema.STRING_SCHEMA,
"message_value"
));
return records;
}
}
✅ 打包为 JAR,放入
plugins/目录即可加载。
九、最佳实践建议
| 实践 | 说明 |
|---|---|
| ✅ 使用 Distributed 模式 | 生产环境高可用 |
✅ 合理设置 task.max | 提升并行度 |
| ✅ 监控 Connector 状态 | 通过 REST API 或日志 |
| ✅ 使用 Avro + Schema Registry | 保证数据格式一致性 |
| ✅ 避免 Sink 写入瓶颈 | 如 ES 写入慢,需调优 |
| ✅ 定期备份 Offset | 防止数据重复 |
| ✅ 结合 RocketMQ Console 监控 | 查看 Topic 消息量 |
十、常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| Connector 启动失败 | 配置错误、依赖缺失 | 检查日志、JAR 包 |
| 数据未同步 | Offset 问题、权限不足 | 检查数据库权限、Offset 存储 |
| Sink 写入慢 | 外部系统性能瓶颈 | 优化目标系统、增加 Task |
| 重复数据 | Offset 未正确提交 | 确保幂等或开启事务 |
| 连接超时 | 网络问题 | 检查防火墙、超时配置 |
✅ 总结
| 维度 | 说明 |
|---|---|
| 定位 | 数据集成与管道工具 |
| 核心能力 | Source(入) + Sink(出) |
| 部署模式 | Standalone / Distributed |
| 扩展性 | 支持自定义 Connector |
| 可靠性 | 支持 Offset 管理,保证不丢不重 |
| 适用场景 | 数据同步、日志采集、系统解耦 |
🚀 一句话总结:
RocketMQ Connect 是 RocketMQ 的“数据桥梁”,
它让 RocketMQ 能轻松对接各种数据源和数据目的地,
实现“数据自由流动”,是构建现代数据架构的关键组件。
掌握 RocketMQ Connect,你就能构建出自动化、高可靠、低延迟的数据管道,打通系统之间的“信息孤岛”。
1121

被折叠的 条评论
为什么被折叠?



