Canal原始碼分析----MetaManager
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:
- batches:未ack的位置範圍,key為batchId(每次拉取資料都會給客戶端返回一個batchId)
- 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
相關文章
- 「從零單排canal 03」 canal原始碼分析大綱原始碼
- Canal 原始碼走讀原始碼
- 「從零單排canal 07」 parser模組原始碼解析原始碼
- 「從零單排canal 05」 server模組原始碼解析Server原始碼
- 「從零單排canal 06」 instance模組原始碼解析原始碼
- Retrofit原始碼分析三 原始碼分析原始碼
- 「從零單排canal 04」 啟動模組deployer原始碼解析原始碼
- canal原始碼之BooleanMutex(基於AQS中共享鎖實現)原始碼BooleanMutexAQS
- 集合原始碼分析[2]-AbstractList 原始碼分析原始碼
- 集合原始碼分析[1]-Collection 原始碼分析原始碼
- 集合原始碼分析[3]-ArrayList 原始碼分析原始碼
- Guava 原始碼分析之 EventBus 原始碼分析Guava原始碼
- Android 原始碼分析之 AsyncTask 原始碼分析Android原始碼
- 【JDK原始碼分析系列】ArrayBlockingQueue原始碼分析JDK原始碼BloC
- 以太坊原始碼分析(36)ethdb原始碼分析原始碼
- 以太坊原始碼分析(38)event原始碼分析原始碼
- 以太坊原始碼分析(41)hashimoto原始碼分析原始碼
- 以太坊原始碼分析(43)node原始碼分析原始碼
- 以太坊原始碼分析(52)trie原始碼分析原始碼
- 深度 Mybatis 3 原始碼分析(一)SqlSessionFactoryBuilder原始碼分析MyBatis原始碼SQLSessionUI
- 以太坊原始碼分析(51)rpc原始碼分析原始碼RPC
- 【Android原始碼】Fragment 原始碼分析Android原始碼Fragment
- 【Android原始碼】Intent 原始碼分析Android原始碼Intent
- k8s client-go原始碼分析 informer原始碼分析(6)-Indexer原始碼分析K8SclientGo原始碼ORMIndex
- k8s client-go原始碼分析 informer原始碼分析(4)-DeltaFIFO原始碼分析K8SclientGo原始碼ORM
- 以太坊原始碼分析(20)core-bloombits原始碼分析原始碼OOM
- 以太坊原始碼分析(24)core-state原始碼分析原始碼
- 以太坊原始碼分析(29)core-vm原始碼分析原始碼
- 【MyBatis原始碼分析】select原始碼分析及小結MyBatis原始碼
- redis原始碼分析(二)、redis原始碼分析之sds字串Redis原始碼字串
- ArrayList 原始碼分析原始碼
- kubeproxy原始碼分析原始碼
- [原始碼分析]ArrayList原始碼
- redux原始碼分析Redux原始碼
- preact原始碼分析React原始碼
- Snackbar原始碼分析原始碼
- React原始碼分析React原始碼
- CAS原始碼分析原始碼