Mekal Z

Mekal Z

A programmer running out of the wall.
twitter

系統設計面試的CAP定理

  • CAP 定理是系統設計面試中需要理解的一個重要數據庫概念。CAP 代表一致性、可用性和分區容忍性,因此稱為 CAP 定理。
    id:: 63eb007d-e404-4950-aa61-3e20077a5856
    • 一致性指的是所有用戶能夠在同一時間看到相同的數據。
    • 可用性意味著系統即使在節點故障的情況下也始終可用於讀取或寫入。
    • 分區容忍性意味著即使節點之間的通信失敗,系統仍然能繼續運行。
  • 該定理指出,在分佈式系統中,這三個屬性中只能保證兩個。
  • 我們的假設是網絡分區會發生,因此要提供任何可靠的服務,分區容忍性是必要的。因此,你不能選擇放棄 CAP 中的 P。這使我們必須在保證一致性和可用性之間進行權衡。
    id:: 63eb0459-f049-4ba1-9ce7-5449b9144de8
  • 一致性
    • 一致性是指在寫入數據庫後,發送到任何節點的所有讀取請求應返回該更新的數據。
    • 想像一個場景,當發生網絡分區時,節點 A 和節點 B 都會拒絕發送給它們的任何寫入請求。這將確保這兩個節點的數據狀態相同。否則,只有節點 A 擁有更新的數據,而節點 B 擁有過時的數據。
    • 有時你會聽到強一致性的術語。CAP 定理中的一致性不一定指強一致性。在強一致的數據庫中,如果數據被寫入後立即讀取,理論上應始終返回更新的數據。
    • 然而,在分佈式系統中,網絡通信不會立即發生,因為節點彼此物理上是分開的,傳輸數據需要一些時間。
    • 這就是為什麼不可能擁有完美的強一致性分佈式數據庫的原因。
      id:: 63eb08ce-93b6-45b2-84c7-252f2d2afee3
    • 在現實世界中,當我們談論優先考慮一致性的數據庫時,通常是指最終一致性且節點之間有非常短的不可察覺的延遲時間的數據庫。
      id:: 63eb0a3e-118c-4dae-8d3e-fca205c2f385
    • 所以再總結一下,CAP 定理中的一致性意味著所有用戶能夠在同一時間看到相同的數據。
  • 可用性
    • 在優先考慮可用性的數據庫中,節點之間存在不一致數據是可以接受的,其中一個節點可能包含過時數據,而另一個節點擁有最新數據。
    • 可用性意味著我們優先考慮節點完成發送給它們的請求。可用的數據庫往往具有最終一致性,這意味著在某段時間後,當網絡分區得到解決時,所有節點最終將彼此同步以擁有相同的更新數據。在這種情況下,節點 A 將首先接收更新,然後過一段時間,節點 B 也將更新。
  • 一致性還是可用性?
    • 那麼什麼時候應該優先考慮一致性或可用性?如果你正在處理需要保持最新的數據,那麼你會想優先考慮一致性。另一方面,如果查詢的數據可以稍微過時,那麼將其存儲在可用的數據庫中可能是更好的選擇。
    • 這裡有一些例子以便更好地理解。
      • 想像一下你正在構建一個像亞馬遜的應用程序,購物者可以瀏覽產品目錄,然後如果有庫存就購買它們。你想確保產品實際上在庫中,否則你必須為缺貨的商品退還購物者的款項。
      • 你的數據庫存儲產品信息應優先考慮一致性還是可用性?在這裡你應該選擇一致性。在網絡分區的情況下,節點無法彼此同步時,你寧願不允許任何購物者購買任何產品,也不希望有兩個或更多的購物者在只有一件商品可用的情況下購買同一產品。
      • 可用的數據庫將允許後者,然後至少有一位購物者的訂單將被取消或退還。
      • 讓我們想像另一種情況,假設同樣的亞馬遜產品,一位產品經理決定在網絡故障期間退還購物者的款項比顯示缺貨更具成本效益。在這種情況下,你會想優先考慮可用性,因為在網絡故障期間取消和退還訂單將比完全不允許購物者購買產品更可取。
        id:: 63eb1f8c-43d8-40a2-94fa-9fc99a458545
  • 從上述討論中,你會注意到這裡只討論了寫入請求,這是因為讀取請求不會改變數據的狀態,並且不需要在節點之間重新同步。對於一致性和可用的數據庫,在網絡分區期間,讀取請求通常是可以的。
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。