Canal原始碼分析----MetaManager

weixin_34087301發表於2018-03-17

MetaManager即meta資訊管理器,在Canal中主要用來管理一些後設資料的資訊,下面以記憶體版實現MemoryMetaManager為例來分析

public class MemoryMetaManager extends AbstractCanalLifeCycle implements CanalMetaManager {

    protected Map<String, List<ClientIdentity>>              destinations;
    protected Map<ClientIdentity, MemoryClientIdentityBatch> batches;
    protected Map<ClientIdentity, Position>                  cursors;

    public static class MemoryClientIdentityBatch {

        private ClientIdentity           clientIdentity;
        private Map<Long, PositionRange> batches          = new MapMaker().makeMap();
        private AtomicLong               atomicMaxBatchId = new AtomicLong(1);

    }
}
public class ClientIdentity implements Serializable {

    private String destination;//instance的name
    private short  clientId;//client的Id
    private String filter;//Client指定的filter

}
public class PositionRange<T extends Position> implements Serializable {

    private static final long serialVersionUID = -9162037079815694784L;
    private T                 start;
    // add by ljh at 2012-09-05,用於記錄一個可被ack的位置,保證每次提交到cursor中的位置是一個完整事務的結束
    private T                 ack;
    private T                 end;

}

destinations:儲存著Client端資訊,key為ClientId
batches:儲存著Client對應的未ack的記錄,key為ClientId
cursors:儲存著Client對應的ack的位置,key為ClientId
MemoryClientIdentityBatch:

  1. batches:未ack的位置範圍,key為batchId(每次拉取資料都會給客戶端返回一個batchId)
  2. atomicMaxBatchId:最大的batchId,遞增

上面就是MetaManager的資料結構,那麼MetaManager有什麼功能了,先看下介面主要的方法宣告

public interface CanalMetaManager extends CanalLifeCycle {

    void subscribe(ClientIdentity clientIdentity) throws CanalMetaManagerException;

    void unsubscribe(ClientIdentity clientIdentity) throws CanalMetaManagerException;

    Position getCursor(ClientIdentity clientIdentity) throws CanalMetaManagerException;

    void updateCursor(ClientIdentity clientIdentity, Position position) throws CanalMetaManagerException;

    PositionRange getFirstBatch(ClientIdentity clientIdentity) throws CanalMetaManagerException;

    PositionRange getLastestBatch(ClientIdentity clientIdentity) throws CanalMetaManagerException;

    Long addBatch(ClientIdentity clientIdentity, PositionRange positionRange) throws CanalMetaManagerException;

    void addBatch(ClientIdentity clientIdentity, PositionRange positionRange, Long batchId)
                                                                                           throws CanalMetaManagerException;
    PositionRange getBatch(ClientIdentity clientIdentity, Long batchId) throws CanalMetaManagerException;

    PositionRange removeBatch(ClientIdentity clientIdentity, Long batchId) throws CanalMetaManagerException;

    void clearAllBatchs(ClientIdentity clientIdentity) throws CanalMetaManagerException;

}

subscribe:以destination做key,儲存對應的ClientIdentity資訊到destinations中
unsubscribe:從destinations中移除對於的Client資訊
以上兩個方法在當Client發起subscribe/unsubscribe請求的時候會呼叫

getCursor:獲取Client Ack到的位置資訊
例如在Server處理Client的get請求的時候,會先獲取該資訊,來判斷應該獲取多少資料

updateCursor:更新Client Ack到的位置資訊
例如在Server處理Client的ack請求的時候,會更新該資訊

getFirstBatch:獲取第一個未確認的位置資訊,即從MemoryClientIdentityBatch的batches中獲取batchId最小的位置資訊。因為batchId是遞增的,batchId最小的即為第一個
getLastestBatch:與getFirstBatch相反。
例如在Server處理Client的get請求的時候,會先獲取未確認的資訊進行處理

addBatch:將一個未確認的位置資訊新增到MetaManager
例如在Server處理Client的get請求的時候,會取到當次獲取的資料的起始位置,即為PositionRange,將其新增進MetaManager

removeBatch:確認或者回滾後將位置資訊從MetaManager中移除

clearAllBatchs:回滾後將位置資訊從MetaManager中移除

上面就是記憶體版MetaManager的功能,MetaManager有多個實現,
基於ZK:結構和記憶體實現類似
基於記憶體:即上面說的
基於混合模式:實現和記憶體的類似,但是會定時將資料上傳到zk

相關文章