开发者社区> 问答> 正文

canal 1.1.0 的Entry解析性能问题

这里entry.toByteString()是基于什么考虑?我们从canal 1.0.24升级到1.1.0,发现性能差了很多。 我看到这个地方,已经拿到Entry对象了,应该可以缓存起来,这样业务上就不需要再次做一次parse了。

public Event(LogIdentity logIdentity, CanalEntry.Entry entry){
    this.logIdentity = logIdentity;
    this.entryType = entry.getEntryType();
    this.executeTime = entry.getHeader().getExecuteTime();
    this.journalName = entry.getHeader().getLogfileName();
    this.position = entry.getHeader().getLogfileOffset();
    this.serverId = entry.getHeader().getServerId();
    this.gtid = entry.getHeader().getGtid();
    this.eventType = entry.getHeader().getEventType();
    // build raw
    this.rawEntry = entry.toByteString();
    this.rawLength = rawEntry.size();
    if (entryType == EntryType.ROWDATA) {
        List<CanalEntry.Pair> props = entry.getHeader().getPropsList();
        if (props != null) {
            for (CanalEntry.Pair p : props) {
                if ("rowsCount".equals(p.getKey())) {
                    rowsCount = Integer.parseInt(p.getValue());
                    break;
                }
            }
        }
    }
}

类似的还有这里,其实已经有RowChange了,但是都被序列化成bytes了。

        RowChange rowChange = rowChangeBuider.build();
        if (tableError) {
            Entry entry = createEntry(header, EntryType.ROWDATA, ByteString.EMPTY);
            logger.warn("table parser error : {}storeValue: {}", entry.toString(), rowChange.toString());
            return null;
        } else {
            Entry entry = createEntry(header, EntryType.ROWDATA, rowChange.toByteString());
            return entry;
        }

我们用的是 CanalServerWithEmbedded

原提问者GitHub用户toruneko

展开
收起
Java工程师 2023-05-08 19:01:29 108 0
1 条回答
写回答
取消 提交回答
  • entry.toByteString()主要是针对server/client这样的部署模式,避免在client.get操作时序列化周期过长导致client tps上不去 可以考虑增加一个配置,允许保留entry对象,这样会带来内存上的额外开销

    原回答者GitHub用户agapple

    2023-05-09 18:56:58
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像