2016-12-26 83 views
1

我有一個必須添加到採購訂單的產品列表。採購訂單有一個序列號,一旦產品被添加,他們的狀態應該被改變,以表明這些是不可購買的。Cassandra - 批量過大

在1採購訂單被處理產品的典型數量是500

在DB - I有2個表 - > 1的產品,而另一個用於訂購單。這意味着我需要500次更新和1次插入。 當我嘗試在BatchStatement中執行此操作時,出現錯誤 - 批量過大。

來自各方的建議告訴我,我應該使用多個異步查詢。然而,我關心的是整個行動的原子性。 請建議根據我的要求,最好的方式是什麼。

在此先感謝。

回答

2

這很有趣。將大量插入(> 10)插入批處理(以實現原子性)實際上是一個糟糕的表現,因此提高批處理限制並非真正的選擇。由於Cassandra也在單行級別管理原子性,因此您可以通過添加一個表來「書籤」您的採購訂單來使用該模型,只需在一行中存儲採購訂單標識和項目到地圖中,所以你在你的查詢中具有冪等性。然後,您可以展開或後處理此表以根據需要繼續工作流程。

1

但是我擔心的是整個操作的原子性。請根據我的要求提出什麼是最好的方法。

請注意,卡桑德拉批次不提供隔離(http://www.datastax.com/dev/blog/atomic-batches-in-cassandra-1-2):

需要注意的是,我們指的是在數據庫意義上的「原子」,如果該批次的任何部分成功,這一切會。沒有其他擔保是隱含的;特別是沒有隔離;其他客戶端將能夠從批處理中讀取第一個更新的行,而其他客戶端正在處理中。

因此,如果您需要隔離,如@ xmas79回答,您應該將產品和採購訂單一起存儲在一張表中。

如果隔離和性能並不重要,你可以嘗試調整卡桑德拉YAML和batch_size_fail_threshold_in_kb參數

增加值失敗的任何批次超過該值。 50kb(10倍警告閾值)。