如果有多个parition,对消息进行分区时对于update消息是按照后项的值进行hash的,如果源端短时间对pk值进行update,则有可能导致发往不同分区,从而无法保证顺序性。
假如 1.有源表和目标表:create table test(id int(10) primary key)
2.源表的增量数据通过canal发往kafka,目标表接收kafka消息进行同步。
3.发往的topic下有三个partition:p0、p1、p2
4.源端和目标端都有一条记录id=1
此时对源端进行两次update: update1:update test set id=2 where id=1; update2: update test set id=3 wehre id=2; 假如两条消息都在同一批message中发往kafka,其中update1发送到p1,pudate2发送到p2,这两条消息的顺序性是无法保证的,假如update2先到达,则目标端最终结果为id=2,与源端结果id=3不一致。
可否考虑以下方案: 参考flink的Retract模式,将update拆分为insert和delete,这样便可保证最终一致性。
同样以上述案例为例: 将update1拆为delete 1和insert 2 将update2拆为delete 2和insert 3
delete 1发送到p0,insert 2发送到p1,delete 2发送到p1,insert 3发送到p2
由于update1先于update2产生,因此在p1中insert 2必在delete 2之前,此时无论p0、p1、p2中的消息到达顺序如何,对于目标端来说都能保证结果是id=3,保证了最终一致性。
原提问者GitHub用户516669850
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。