簡體   English   中英

填充兩個 Cassandra 表時首選哪種解決方案?

[英]Which solution is preferred when populating two Cassandra tables?

我有一個性能問題。 我在 Cassandra 中有兩張表,它們的結構完全相同。 我需要在他們兩個中保存傳入的數據。 我遇到的問題是什么是更好的解決方案:

  1. 創建兩個存儲庫,都打開Cassandra session,將數據分別保存到兩個表中(全部在代碼中)。
  2. 將數據保存到一個表中,在該表上設置觸發器並將傳入的數據復制到另一個表中
  3. 還有其他解決方案嗎?

我認為前兩個還可以,但我不確定第一個是否足夠好。 有人可以向我解釋嗎?

這聽起來像是BATCH的一個很好的用例。 本質上,您可以組裝兩個 write 語句並在BATCH中執行它們以確保原子性。 這應該使兩個表保持同步。 以下示例來自 DataStax 文檔 ( URL )。

cqlsh> BEGIN LOGGED BATCH
    INSERT INTO cycling.cyclist_names (cyclist_name, race_id) VALUES ('Vera ADRIAN', 100);
    INSERT INTO cycling.cyclist_by_id (race_id, cyclist_name) VALUES (100, 'Vera ADRIAN');
APPLY BATCH;

+1 對 Aaron 關於使用BATCH語句的回應,但引用的示例特定於 CQL。 在您的應用程序中實現它時會更加細致入微。

如果您使用的是 Java 驅動程序,典型的INSERT語句將如下所示:

SimpleStatement simpleInsertUser = SimpleStatement.newInstance(
  "INSERT INTO users (...) VALUES (?), "..." );

這是一個准備好的聲明:

PreparedStatement psInsertUserByMobile = session.prepare(
  "INSERT INTO users_by_mobile (...) VALUES (...)" );

如果您要批處理這兩個語句:

BatchStatement batch = BatchStatement.newInstance(
  DefaultBatchType.LOGGED,
  simpleInsertBalance,
  preparedInsertExpense.bind(..., false) );

session.execute(batch);

對於您列表中的第 2 項,我不知道在生產中使用 Cassandra TRIGGER 的公司,因此我不建議這樣做。 它是實驗性的一段時間,我沒有足夠的經驗來推薦它們進行生產。

對於第 3 項,這是物化視圖試圖解決的用例。 從開發人員的角度來看,它們肯定要簡單得多,因為表更新是在服務器端而不是客戶端完成的。

如果您沒有很多表,則可以使用它們,但請注意視圖的更新是異步發生的(與基表上發生突變的時間不同)。 對於 MV,當視圖與基表不同步時,唯一的解決方案就是刪除並重新創建 MV。

如果您不想使用 BATCH 語句,只需確保您完全了解使用 MV 的權衡。 如果您有興趣,我已經在https://community.datastax.com/articles/2774/中更詳細地解釋了它。 干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM