[英]Which solution is preferred when populating two Cassandra tables?
我有一個性能問題。 我在 Cassandra 中有兩張表,它們的結構完全相同。 我需要在他們兩個中保存傳入的數據。 我遇到的問題是什么是更好的解決方案:
我認為前兩個還可以,但我不確定第一個是否足夠好。 有人可以向我解釋嗎?
這聽起來像是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.