第四步优化已经进行了一大半,大致的效果相比于完全未优化之前提升了35%的吞吐量,可以跑到8~9万的TPS (本次压测数据和之前的批量insert不同,选择了业务上随机的一个库进行跑,19MB的binlog,大概网络传输在35MB左右)
优化点:
CanalEntry对象的序列化提前在进入ringbuffer之前就完成,最后sessionHandler只做ByteString拷贝,有部分提升
SimpleCanalConnector增加了lazyParseEntry参数,支持lazy解析CanalEntry对象,减少整个get/ack串行操作的成本,最大化提升串行的吞吐量.
目前的profile分析来看,最大的瓶颈就在于构造网络传输时有多次数组拷贝。
现在的代码:
Packet.Builder packetBuilder = CanalPacket.Packet.newBuilder();
packetBuilder.setType(PacketType.MESSAGES);
Messages.Builder messageBuilder = CanalPacket.Messages.newBuilder();
messageBuilder.setBatchId(message.getId());
if (message.getId() != -1) {
if (message.isRaw()) {
// for performance
if (!CollectionUtils.isEmpty(message.getRawEntries())) {
messageBuilder.addAllMessag