- 概念与总结
- Message和FlatMessage什么区别?
- FlatMessage下的data属性为什么设计为数组?什么情况下是多条数据?
- 批量新增
- 批量更新
- 总结
- 参考资料
- Message和FlatMessage都有各自对应的Handler。
- FlatMessage在网络中传播过程中是一个json;
- 而Message比较接近字节码数据,传输效率高,但需要反序列化;
Message
public class Message implements Serializable {
private static final long serialVersionUID = 1234034768477580009L;
private long id;
private List entries = new ArrayList();
private boolean raw = true;
private List rawEntries = new ArrayList();
public Message(long id, List entries) {
this.id = id;
this.entries = (List)(entries == null ? new ArrayList() : entries);
this.raw = false;
}
public Message(long id, boolean raw, List entries) {
this.id = id;
if (raw) {
this.rawEntries = (List)(entries == null ? new ArrayList() : entries);
} else {
this.entries = (List)(entries == null ? new ArrayList() : entries);
}
this.raw = raw;
}
}
FlatMessage
public class FlatMessage implements Serializable {
private static final long serialVersionUID = -3386650678735860050L;
private long id;
private String database;
private String table;
private List pkNames;
private Boolean isDdl;
private String type;
private Long es;
private Long ts;
private String sql;
private Map sqlType;
private Map mysqlType;
private List
canal使用非flatmessage方式获取mysql bin log日志发至kafka比直接发送json效率要高很多,数据发到kafka后需要实时解析为json。
FlatMessage下的data属性为什么设计为数组?什么情况下是多条数据? 批量新增INSERT INTO `im_bird`.`my_friends`(`id`, `my_user_id`, `my_friend_user_id`) VALUES
('1', '210911C42BA9MT9P', 'xx'),
('2', '210911C42BA9MT9P', 'xx1');
查看bin-log:
show master status; show binlog events in 'mysql-bin.000004'G;
结果如下,并不能判断生成几条binlog:
*************************** 5. row ***************************
Log_name: mysql-bin.000004
Pos: 294
Event_type: Table_map
Server_id: 1
End_log_pos: 358
Info: table_id: 167 (im_bird.my_friends)
*************************** 6. row ***************************
Log_name: mysql-bin.000004
Pos: 358
Event_type: Write_rows
Server_id: 1
End_log_pos: 446
Info: table_id: 167 flags: STMT_END_F
*************************** 7. row ***************************
Log_name: mysql-bin.000004
Pos: 446
Event_type: Xid
Server_id: 1
End_log_pos: 477
Info: COMMIT
7 rows in set (0.00 sec)
mysql版本5.7.18
但经过调试发现也是2条数据会进来。
批量更新图与sql不符,因安全问题,请勿较真~
批量更新数据的时候,mysql row模式binlog 里面会有几条数据?
update lpm_store set name = concat(`name`,'ss') where id in (2009,2010);
如上图,我们可以看到2条数据。
- FlatMessage中的data行数会与old行数保持一致,相同坐标的数据行一一对应修改前后数的数据内容;
- 一个FlatMessage中只有一种type,type的值为UPDATE、INSERT、DELETE;
- 批量数据操作时,data、old(除insert)下会有多条数据。
Flink解析kafka canal未压平数据为message报错



