CanalClient:认识Message和FlatMessage

概念与总结

Message和FlatMessage什么区别?
  • Message和FlatMessage都有各自对应的Handler。
  • FlatMessage在网络中传播过程中是一个json;
  • 而Message比较接近字节码数据,传输效率高,但需要反序列化;

Message

public class Message implements Serializable {
    private static final long serialVersionUID = 1234034768477580009L;
    private long id;
    private List<Entry> entries = new ArrayList();
    private boolean raw = true;
    private List<ByteString> rawEntries = new ArrayList();

    public Message(long id, List<Entry> 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<String> pkNames;
    private Boolean isDdl;
    private String type;
    private Long es;
    private Long ts;
    private String sql;
    private Map<String, Integer> sqlType;
    private Map<String, String> mysqlType;
    private List<Map<String, String>> data;
    private List<Map<String, String>> old;
}

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 /* xid=60 */
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条数据。

总结

  1. FlatMessage中的data行数会与old行数保持一致,相同坐标的数据行一一对应修改前后数的数据内容;
  2. 一个FlatMessage中只有一种typetype的值为UPDATEINSERTDELETE
  3. 批量数据操作时,data、old(除insert)下会有多条数据。
参考资料

Flink解析kafka canal未压平数据为message报错

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子涵先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值