项目用到了阿里云的数据传输服务DTS,主要是数据监听。
参考文档:https://help.aliyun.com/document_detail/26647.html?spm=a2c4g.11186623.2.19.100e6099zLpsGv
用了一段时间,也踩了一些坑,现在做个总结。
数据过滤
DTS读取的是数据库的binlog文件,每秒一次,获取到的数据量是非常庞大的,但是这些数据并不都是我们需要的,尤其是心跳数据,如果不过滤的话,日志文件很快就爆炸。
过滤的方式很简单,只要增加一个判断语句即可。
"INSERT".equals(message.getRecord().getOpt().toString())
DTS的sdk提供为我们提供了以下过滤选项:
INSERT、UPDATE、DELETE、REPLACE、HEARTBEAT、CONSISTENCY_TEST、BEGIN、COMMIT、DDL、ROLLBACK、DML、UNKNOWN;
汉字编码
数据库设计的编码格式是utf8mb4,但是sdk默认数据的是utf8格式,输出的汉字乱码,需要转换。
for (DataMessage.Record.Field field:fieldList) {
String record = field.encoding;
String vlaue = "";
if (record.equals("utf8mb4")){
vlaue= field.getValue().toString("utf8mb4");
}else if (record.equals("utf8")){
vlaue= field.getValue().toString("utf8");
}else {
vlaue= field.getValue().toString();
}
String type = field.getType().toString();
String name = field.getFieldname();
System.out.println("===========字段名:"+name+",字段类型:"+type+",字段编码:"+record+",字段数据:"+vlaue);
}
数据重复
DTS智能保证监听到的数据不丢失,但是不能保证不重复,需要自己进行判断。
每次消费数据后都保存消费位点数据。
String checkPoint = message.getRecord().getCheckpoint();
消费新的数据前与之前的消费位点进行比对。
public boolean equleCheckPoint(String checkPointOld,Stri