canal上部署了51个实例,client(消费所有的实例)与canal部署在同一台服务器上,并且服务器上无其他服务。
client实现 初始化连接
// 根据ip,直接创建链接,无HA的功能
CanalConnector connector = CanalConnectors.newSingleConnector(
new InetSocketAddress(hostIp, port), destination.generateDestination(), "", "");
获取数据
long t1 = System.currentTimeMillis();
Message message = connector.getWithoutAck(10240, 1000L, TimeUnit.MILLISECONDS); //以毫秒为单位
long t2 = System.currentTimeMillis();
long batchId = message.getId();
logger.info("read batchId=[{}], time=[{}]ms", batchId, (t2 -t1));
问题
发现部分实例执行getWithoutAck方法的耗时大于设置值(1000ms),大概在2000ms,数据量大时耗时也随之放大。
下面是client一次请求的分析:
client发送请求(t1) server收到请求(t2) embeddedServer.getWithoutAck()完成,并向client返回数据(t3=10:40:34) client收到数据(t4=10:40:37) 根据日志可知,t4-t1=5000ms,而t4-t3=3000ms,而getWithoutAck耗时为1000ms,因此可以推断出t2-t1=5000-3000-1000=1000ms。
因此,是否可以说明client与CanalServer之间的通信存在耗时?但是这个耗时在一般情况下是忽略不计的!
如果是CanalServer 的性能瓶颈,能否优化? 服务器24核,内存64g
原提问者GitHub用户GitHub-BruceTong
优先看下canal server的jvm内存和GC状态.
a. 一次性取10MB的数据不是一种明智的做法
b. 一个server部署过多的binlog解析队列,也不明智,需要平衡jvm内存和业务'
一般我们内部使用,8个队列,4M+100ms的获取
原回答者GitHub用户agapple
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。