Rama透過拓撲通用語言實現ACID事務

banq發表於2024-04-10


Rama是一個新的程式設計平臺, Rama 的突破最重要的是,它首次出現了用於構建軟體應用程式的內聚模型,無論規模如何。

ACID事務
ACID原子性、一致性、隔離性和永續性是資料庫系統的關鍵特徵。

Rama 提供了強大的 ACID 保證,其效能不亞於任何資料庫,同時所需的調整也更少。

Rama 程式碼中隱含了一個 "事務":

  • 對於流拓撲來說,每個事件都是一個事務,
  • 而對於微批拓撲來說,整個微批都是一個事務。

這些 "事務 "使用通用圖靈完備的資料流 API 進行程式設計,可在任意點使用任意 Java 或 Clojure 程式碼,這是與資料庫的另一個重大區別,其深遠影響超越了 ACID 語義。

原子性
原子性是指資料儲存上的所有操作一起成功或失敗。

  • 如果任何操作失敗,則任何更改都不可見。
  • 如果操作成功,所有更改應同時可見。

因此,應該不可能看到資料儲存處於不一致狀態。

Rama的流拓撲提供事件級別的原子性:

  • 同一事件中對所有狀態的所有更新都將同時可見,並且處理中的任何失敗都將導致任何掛起的更改被刪除。
  • 根據流拓撲的配置方式,可以透過從頭開始再次處理庫記錄來重試這些更新。

程式碼:

stream.source(<font>"*depot").out("*tuple")
      .each(Ops.EXPAND,
"*tuple").out("*key", "*value")
      .compoundAgg(
"$$counts", CompoundAgg.map("*key", Agg.count()))
      .compoundAgg(
"$$values", CompoundAgg.map("*key", Agg.set("*value")))
      .hashPartition(
"*value")
      .compoundAgg(
"$$valueCounts", CompoundAgg.map("*value", Agg.count()));

流拓撲事件是分割槽器partitioner 呼叫之間的所有程式碼。

這段程式碼中有兩個事件:

  • 第一個是更新"$$counts "和"$$values"
  • 第二個是更新"$$valueCounts"。

對"$$counts "和"$$values "的更新都是原子更新,讀取操作不可能看到這些不同步的 PStates。
在分割槽器被髮送執行後的下一個事件之前,它們的更新也將變成對讀操作可見。

強一致性
一致性是指僅將有效資料寫入資料儲存。寫入的資料不應違反資料儲存定義中定義的任何約束。

Rama 透過結構驗證、原子更新以及要求複製完成後才能使更改可見,提供了強一致性。

  • 任何違反 PState 結構的寫入都會被拒絕。由於 PState 是包含任意物件的資料結構的任意組合,因此這些模式可以非常詳細。
  • PState 寫入的原子性(如上一節所述)可確保 PState 之間的應用級約束不會被違反。對於流拓撲結構,可以確保同一任務上的共用 PState 具有這種原子性,而對於微批拓撲結構,可以確保所有任務上的所有 PState 具有這種原子性。
  • 複製可確保 PStates 上的讀取永遠不會倒退,即使故障導致一個新的副本接管任務。從 PState 中讀取的資料永遠不會早於已讀取的版本。

隔離性
隔離性是指事務之間的隔離程度及其訪問資料的一致性。對於資料庫,您通常可以選擇不同的“隔離級別”來提供不同的保證,例如:

  • 讀未提交:事務可以讀取已被其他事務修改但未提交的資料,這可能會導致髒讀、不可重複讀和幻讀。
  • 讀已提交:事務僅讀取其他事務已提交的資料。這可以防止髒讀,但允許不可重複讀和幻讀。
  • 可重複讀:保證事務中讀取的任何資料在整個事務期間保持不變。這可以防止不可重複讀取,但仍然允許幻讀,因為在持續時間內其他事務可以插入新資料。
  • Serialized:事務序列執行,防止髒讀、不可重複讀和幻讀。

資料庫中的隔離級別是語義和效能之間的權衡,更強的隔離級別需要更多的協調,從而限制併發性並損害效能。

由於計算和儲存是共置的,因此 Rama 程式碼中永遠不需要隔離級別。您可以獲得出色的效能和針對每個上下文的理想語義。

  • 在流拓撲中,一批流事件在一個任務上執行。
  • 在微批拓撲中,所有倉庫分割槽上的一批資料會同時執行。
  • 在流式處理和微批處理中,Rama 不會繼續執行下一個批次,直到上一個批次完成執行並且所有 PState 的更改都已複製並變得可見。
  • 您可以將每個批次視為一組一起發生的事務,批次的大小根據傳入負載動態調整。

Rama 批處理事件的方式與資料庫中的併發事務具有相同的目的,無需調整隔離級別。
這是一個重大的簡化,因為隔離級別的推理可能很複雜。

耐用性
Rama 為所有 PState 和 depot 更新提供了極其強大的永續性保證。
對 PState 和 depot 的寫入只有在領導者的磁碟上持久且所有 ISR(“同步副本”)從者的磁碟上持久後才可見。

總之,Rama 拓撲的用途與資料庫中的事務相同,只是用通用語言而不是有限的 DSL 來表達。

 

相關文章