Spring Data默認值的錯誤解決

Spring Data有很多配置的默認值,但不一定都適合你。如一個依賴Cassandra 的項目,有時寫入數據後,並不能立馬讀到。這種錯誤並沒有什麼報錯,一切都是正常的,就是讀不到數據。

源碼解析

直接使用 Spring Data Cassandra 操作時,實際依賴 Cassandra driver 內部的配置文件,目錄:

.m2\repository\com\datastax\oss\java-driver-core\4.6.1\java-driver-core-4.6.1.jar!\reference.conf

很多默認配置,很重要配置是 Consistency,driver中默認為 LOCAL_ONE:

basic.request {
 

  # The consistency level.
  #
  # Required: yes
  # Modifiable at runtime: yes, the new value will be used for requests issued after the change.
  # Overridable in a profile: yes
  consistency = LOCAL_ONE
 
//省略其他非關鍵配置 
}

執行讀寫操作時,都會使用 LOCAL_ONE。運行時配置調試截圖:

Cassandra 使用核心原則:使R(讀)+W(寫)>N,即讀和寫的節點數之和大於備份數。

設數據備份 3 份,待寫入數據分別存儲在 A、B、C 節點。常見搭配是 R(讀)和 W(寫)的一致性都是 LOCAL_QURAM,這樣可以保證能及時讀到寫入的數據;而假設在這種情況下,讀寫都用 LOCAL_ONE,則可能發生這樣的情況:用戶寫入一個節點 A 就返回,但用戶 B 立馬讀的節點是 C,由於是LOCAL_ONE 一致性,則讀完 C 就可立馬返回。此時,就會出現數據讀取可能落空case。

為何Cassandra driver 默認使用 LOCAL_ONE?其實是最合適的,因為隻有一臺機器,讀寫都隻能命中一臺。但產線上的 Cassandra 大多都是多數據中心多節點的,備份數大於1。所以讀寫都用 LOCAL_ONE 就會出現問題。

修正

修改默認值,以 consistency 為例。

@Override
protected SessionBuilderConfigurer getSessionBuilderConfigurer() {
    return cqlSessionBuilder -> {
        DefaultProgrammaticDriverConfigLoaderBuilder defaultProgrammaticDriverConfigLoaderBuilder = new DefaultProgrammaticDriverConfigLoaderBuilder();
        driverConfigLoaderBuilderCustomizer().customize(defaultProgrammaticDriverConfigLoaderBuilder);
        cqlSessionBuilder.withConfigLoader(defaultProgrammaticDriverConfigLoaderBuilder.build());
        return cqlSessionBuilder;
    };
}

@Bean
public DriverConfigLoaderBuilderCustomizer driverConfigLoaderBuilderCustomizer() {
    return loaderBuilder -> loaderBuilder
            .withString(REQUEST_CONSISTENCY, ConsistencyLevel.LOCAL_QUORUM.name())
}

將一致性級別從 LOCAL_ONE 改成瞭 LOCAL_QUARM,符合實際產品部署和應用情況。

到此這篇關於Spring Data默認值的錯誤解決的文章就介紹到這瞭,更多相關Spring Data默認值內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: