Otter同步延遲導致數據庫反查(補充)
在上一篇文章中,談到Otter中出現反查會帶來的問題Otter同步延遲導致數據庫反查(使用Otter遇到的問題二),在查看了代碼後(DatabaseExtractor.java)發現反查中存在多層的判斷。
本篇爲對於雙向同步出現問題的推測,不作爲最終的結論
條件
代碼如下:
if (flag && (eventData.getEventType().isInsert() || eventData.getEventType().isUpdate())) {// 判斷是否需要反查
Future future = completionService.submit(new DatabaseExtractWorker(pipeline, item), null); // 提交進行並行查詢
if (future.isDone()) {
// 立即判斷一次,因爲使用了CallerRun可能當場跑出結果,針對有異常時快速響應,而不是等跑完所有的才拋異常
try {
future.get();
} catch (InterruptedException e) {
cancel(futures);// 取消完之後立馬退出
throw new ExtractException(e);
} catch (ExecutionException e) {
cancel(futures); // 取消完之後立馬退出
throw new ExtractException(e);
}
}
futures.add(future);// 記錄一下添加的任務
}
可以看出進行了判斷:
if (flag && (eventData.getEventType().isInsert() || eventData.getEventType().isUpdate()))
flag
代碼如下:
boolean flag = mustDb || (eventData.getSyncConsistency() != null && eventData.getSyncConsistency().isMedia());
對於mustDb:
boolean mustDb = pipeline.getParameters().getSyncConsistency().isMedia();
public boolean isMedia() {
return this.equals(SyncConsistency.MEDIA);
}
public static enum SyncConsistency {
/** 基於當前介質最新數據 */
MEDIA("M"),
/** 基於當前的store記錄的數據 */
STORE("S"),
/** 基於當前的變更value,最終一致性 */
BASE("B");
...
}
若關閉數據庫反查,channel配置如圖:
此時查看數據庫的配置:
mysql> select * from otter.channel;
...
{"channelId":116,"enableRemedy":false,"remedyAlgorithm":"LOOPBACK","remedyDelayThresoldForMedia":60,"syncConsistency":"BASE","syncMode":"FIELD"}
...
得到:
- enableRemedy=‘false’,則mustDb同樣爲false。
- (eventData.getSyncConsistency() != null
- eventData.getSyncConsistency().isMedia()) = false
即flag=false。
.
(eventData.getEventType().isInsert()
判斷是否爲INSERT
.
eventData.getEventType().isUpdate()))
判斷是否爲UPDATE
.
綜上可得,當變更的類型爲UPDATE時,就一定會觸發數據庫反查
.
.
反查導致的問題
在發生的數據庫反查時,若配置了主站點,則在反查時,就會進行update的覆蓋。具體變現爲: