代码结构
核心类实现MemoryEventStoreWithBuffer,基于内存构建memory store
doput 方法 上一节已经分析过
开始分析get方法
1.重入锁 加锁
2.检查是否存在要get的数据,并且数量要大于batchSize
2.1 计算maxAbleSize - currentSize >= batchSize * bufferMemUnit
3. 调用doGet方法
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