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 的性能瓶颈,能否优化?