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"}
...

得到:

  1. enableRemedy=‘false’,則mustDb同樣爲false。
  2. (eventData.getSyncConsistency() != null
  3. eventData.getSyncConsistency().isMedia()) = false

flag=false
.

(eventData.getEventType().isInsert()

判斷是否爲INSERT

.

eventData.getEventType().isUpdate()))

判斷是否爲UPDATE

.

綜上可得,當變更的類型爲UPDATE時,就一定會觸發數據庫反查
.
.

反查導致的問題

在發生的數據庫反查時,若配置了主站點,則在反查時,就會進行update的覆蓋。具體變現爲:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章