Repro:
使用default-instance模式(有Zookeeper支持)的Canal Server; Setup第一个ClusterCanalClient,调用connect的时候,成功连接; Setup第二个ClusterCanalClient,调用connect的时候,会抛Exception: com.alibaba.otter.canal.protocol.exception.CanalClientException: should connect first at com.alibaba.otter.canal.client.impl.SimpleCanalConnector.waitClientRunning(SimpleCanalConnector.java:418) at com.alibaba.otter.canal.client.impl.SimpleCanalConnector.subscribe(SimpleCanalConnector.java:186) at com.alibaba.otter.canal.client.impl.ClusterCanalConnector.subscribe(ClusterCanalConnector.java:100) Expected: 第二个ClusterCanalClient在connect的时候应该被block住,直至其它的client disconnect。
推测原因(见下面的gist修改)
https://gist.github.com/caojia/10960073/revisions
原提问者GitHub用户caojia
根据您提供的信息,可以推测SimpleCanalConnector在连接时会先检查是否已经连接到Canal Server,如果没有连接则会抛出"should connect first"的异常。在多个ClusterCanalClient同时连接时,可能存在竞争的情况,导致第二个ClusterCanalClient在连接前没有等待第一个连接完成,从而抛出异常。
可以通过在SimpleCanalConnector中添加同步锁或使用并发控制机制来解决这个问题,确保每个ClusterCanalClient都可以顺利连接Canal Server。同时,也可以在ClusterCanalClient中进行优化,确保每个连接都等待前一个连接完成后再进行连接。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。