代码结构

Canal 源码分析 05 store 实现_数据

核心类实现MemoryEventStoreWithBuffer,基于内存构建memory store

doput 方法 上一节已经分析过

开始分析get方法

Canal 源码分析 05 store 实现_d3_02

1.重入锁 加锁

2.检查是否存在要get的数据,并且数量要大于batchSize

Canal 源码分析 05 store 实现_get方法_03

   2.1 计算maxAbleSize - currentSize >= batchSize * bufferMemUnit

3. 调用doGet方法

Canal 源码分析 05 store 实现_d3_04

3.1 如果是根据对象数量获取,计算end 位置,然后从内存中提取对应的数据,得到event。


3.2 如event类型是ddl事件,就加入到entrys列表,然后break 跳出循环; 其余情况,就正常把从内存获取的event加入到entrys列表


3.3 else 意味着根据内存大小获取数据data,也是依次从内存中获取event,然后累加每次获取数据的内存大小memSize


3.4 创建位点position,然后记录范围的start和end


3.5 GTID模式,ack的位点必须是事务结尾,因为下一次订阅的时候mysql会发送这个gtid之后的next,如果在事务头就记录了会丢这最后一个事务


3.6 更新getSequence和getMemsize