在flink流式计算中,需要动态的更新配置,而无需重启作业进程。
通过mysql binlog机制,可以实现配置的变化并可以捕获这一变化;
通过flink的broadcast机制,可以将这一动态变化广播到业务流,并进行相应的逻辑处理,最终实现配置的动态更新。
下面写一个简单的demo,仅供平时学习积累使用。
CDC
CDC全称Change Data Capture,变动数据捕获。它的核心思想是,监测并捕获数据库的变动,将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅及消费。
mysql binlog
MySQL 可以通过 binlog记录数据库的变动事件,而 MySQL 本身可以借助 binlog 来实现主从复制。binglog存储成二进制文件,可以通过mysql-binlog-connector-java包提供的类进行解析。下面是一个demo。
1. 创建一张配置表。
CREATE TABLE tb_config(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`source` VARCHAR(15),
`parameter` VARCHAR(15),
`operator` INT COMMENT "0是等于;是不等于;2是小于;3是大于",
`value` VARCHAR(15),
PRIMARY KEY (`id`)
);
2. 查看数据库中binlog信息,Log_name就是bin log文件名,FileSize是该文件的大小。
SHOW MASTER LOGS;
3. 通过BinaryLogClient解析binlog。
public static void main(String[] args) throws Exception {
final BinaryLogClient client =
new BinaryLogClient("127.0.0.1", 3306, "root", "root");
client.setBinlogFilename("LAPTOP-LH-bin.000038"); //指定binlog文件
client.setBinlogPosition(0); //指定从binlog的哪个位置开始读取
client.registerEventListener(new BinaryLogClient.EventListener() {
public void onEvent(Event event) {
System.out.println("===========" + client.getBinlogPosition() + "===========");
System.out.println("info=" + event.toString());
}
});
client.connect();
}
日志如下,此时如果对于数据库表进行增删改操作,binlog都会追加相应的信息。
===========2901===========
info=Event{header=EventHeaderV4{timestamp=1618712448000, eventType=EXT_WRITE_ROWS, serverId=1, headerLength=19, dataLength=29, nextPosition=3016, flags=0}, data=WriteRowsEventData{tableId=1527, includedColumns={0, 1, 2}, rows=[
[uid, 0, 004]
]}}
===========3016===========
info=Event{header=EventHeaderV4{timestamp=1618712448000, eventType=XID, serverId=1, headerLength=19, dataLength=12, nextPosition=3047, flags=0}, data=XidEventData{xid=1794}}
配置动态更新Demo
数据源准备
测试数据来源于kafka的tb_data topic,配置数据源来源于mysql的tb_config表,最终根据配置,将处理后的测试数据,输出到控制台。
tb_data的数据格式是一个简单json:
{"uid": "001", "timestamp":"1618559580", "actionID":1, "source":"a"}
{"uid": "003", "timestamp":"1618559590", "actionID":3, "source":"a"}
{"uid": "0