避免在Cassandra中使用清单
Apache Cassandra是一種快速且可擴(kuò)展的數(shù)據(jù)庫(kù),多年來(lái),它變得與傳統(tǒng)SQL數(shù)據(jù)庫(kù)一樣容易使用。 至少在表面上。
您使用類似SQL的查詢,但是它們有很多限制; 您有一個(gè)模式,但是修改它并不像在SQL數(shù)據(jù)庫(kù)中那樣靈活; 您具有帶有主鍵的相同表格結(jié)構(gòu),但是由于分區(qū)鍵和排序鍵之間的區(qū)別,因此更加復(fù)雜。 乍看之下,有很多底層細(xì)節(jié)并不重要,但它們對(duì)于性能和數(shù)據(jù)一致性至關(guān)重要,例如墓碑,SSTable壓縮等。
但是我想討論“列表”列類型,因?yàn)樽罱覀冇龅搅艘粋€(gè)非常難以捉摸的問(wèn)題。 我們致力于保證數(shù)據(jù)的完整性,這就是為什么我們的記錄永遠(yuǎn)不會(huì)更新的原因。 這很適合Cassandra,因?yàn)橐_地進(jìn)行更新很棘手。 但是,在我們的一個(gè)部署中,我們注意到了一些奇怪的事情–很少有,在與索引數(shù)據(jù)進(jìn)行比較時(shí),數(shù)以百萬(wàn)計(jì)的特定條目中的數(shù)據(jù)散列將不匹配。 經(jīng)過(guò)調(diào)查,我們注意到“列表”類型的列具有重復(fù)值。 這不是代碼的問(wèn)題,因?yàn)樵谶@種特殊情況下,代碼始終使用Collections.singletonList(..)
似乎Cassandra試圖變得更聰明,并且當(dāng)在批處理插入中看到相同的條目時(shí),它試圖合并它們,而不是覆蓋彼此,而是嘗試將它們合并,從而產(chǎn)生具有重復(fù)條目的列表。 有關(guān)此問(wèn)題的報(bào)告在此處和此處 。
現(xiàn)在,批處理是一個(gè)困難的話題,而看起來(lái)卻很簡(jiǎn)單卻不是的事情之一。 在大多數(shù)情況下, 批次是反模式 。 在某些情況下,批處理是有用的 ,但是它比預(yù)期的少得多。 那是由于Cassandra的分布式性質(zhì)。 另一個(gè)麻煩來(lái)自于您使用的是令牌感知客戶端還是令牌感知客戶端策略,即您的客戶端是否知道每個(gè)記錄所屬的位置以便向其發(fā)送請(qǐng)求。 我不會(huì)詳細(xì)介紹批處理,因?yàn)樵谶@兩篇鏈接的文章中對(duì)批處理進(jìn)行了很好的解釋。
返回列表–由于在我們的案例中我們沒(méi)有相同的記錄,因此該問(wèn)題很可能是由于網(wǎng)絡(luò)超時(shí)而導(dǎo)致的,此時(shí)客戶端未收到寫(xiě)入確認(rèn),而是再次嘗試再次發(fā)送相同的語(yǔ)句。 我不確定是否批量處理。 但是,假設(shè)有批次或無(wú)批次可能會(huì)更安全。 即列表可以在意外情況下合并。
這是根本不使用列表的嚴(yán)重原因。 沃爾瑪給出了其他參數(shù)
集應(yīng)優(yōu)先于列表,因?yàn)榧?#xff08;和地圖)應(yīng)避免
寫(xiě)前讀模式用于更新和刪除
這僅適用于少量物品。 對(duì)大量(例如數(shù)千個(gè))項(xiàng)目使用集合是另一個(gè)問(wèn)題,因?yàn)槟鸁o(wú)法分批加載項(xiàng)目-可以一次讀取所有項(xiàng)目。
例如,在Java應(yīng)用程序中,即使基礎(chǔ)列的類型為L(zhǎng)ist,也可以輕松地用Set替換List,這將暫時(shí)避免出現(xiàn)問(wèn)題-數(shù)據(jù)仍可能在數(shù)據(jù)庫(kù)中重復(fù),但是至少應(yīng)用程序會(huì)使用獨(dú)特的價(jià)值觀。 但是請(qǐng)記住,Java Set不能保證排序,因此,如果這對(duì)您的邏輯很重要,請(qǐng)確保按照定義明確的比較標(biāo)準(zhǔn)進(jìn)行排序。
“避免清單”(和“避免批次”)的一般建議可以準(zhǔn)確地描述Cassandra。 它看起來(lái)易于使用,但是一旦投入生產(chǎn),您可能會(huì)意識(shí)到存在一些次優(yōu)的設(shè)計(jì)決策。
翻譯自: https://www.javacodegeeks.com/2019/02/avoid-lists-cassandra.html
總結(jié)
以上是生活随笔為你收集整理的避免在Cassandra中使用清单的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: war3必须安装的游戏组件_在单独的WA
- 下一篇: JDK 13:什么是Aggressive