2016-01-22 59 views
1

我使用Cassandra 2.1.12將事件數據存儲在列族中。以下是用於爲.net管理來自Cassandra的連接創建客戶端的c#代碼。現在問題是插入/更新數據的速率非常高。所以,現在我們假設我在隨後的請求中增加了Cassandra中的列值。但正如我所說的插入/更新率非常高。所以在我的3節點集羣,如果第一次 我寫的列的值將是1然後在下一個請求我將讀取此列的值並將其更新爲2.但是,如果從其他節點獲取值未被初始化爲1.然後再次將值存儲爲1.所以,現在爲了解決這個問題,我還保留了consistency的值爲QUORUM。但問題仍然存在。任何人都可以告訴我可能的解決方案嗎?避免髒讀取和寫入cassandra

 private static ISession _singleton; 

     public static ISession GetSingleton() 
     { 
      if (_singleton == null) 
      { 
       Cluster cluster = Cluster.Builder().AddContactPoints(ConfigurationManager.AppSettings["cassandraCluster"].ToString().Split(',')).Build(); 
       ISession session = cluster.Connect(ConfigurationManager.AppSettings["cassandraKeySpace"].ToString()); 
       _singleton = session; 
      } 
      return _singleton; 
     } 
+0

我希望QUORAUM拼寫不正確?拼寫應該是QUORUM –

+0

@HarishShan對不起,集羣拼寫正確。在輸入問題時,我寫錯了。 – Naresh

回答

1

沒有,這是不可能實現卡桑德拉你的目標。原因是,每個分佈式應用程序都在CAP theorem之內。據此,cassandra does not have Consistency

enter image description here

在方案

所以,你要更新在多線程環境中的許多時間相同的分區鍵,所以不能保證看到所有線程的最新數據。如果嘗試間隔時間較短,則可能會在所有線程中看到最新數據。如果您的要求是遞增/遞減整數,那麼您可以使用cassandra counters。但是,cassandra計數器不支持在單個請求中檢索更新後的值。這意味着您可以請求增加計數器並有一個單獨的請求來獲取更新的值。無法增加並在單個請求中獲取遞增的值。如果你的要求是隻增加數值(比如計算頁面瀏覽次數),那麼你可以使用cassandra計數器。卡桑德拉計數器不會錯過任何增量/減量。最後你可以看到實際的數據。希望能幫助到你。

+0

閱讀有關c *計數器的信息,請點擊此處http://www.datastax.com/dev/blog/whats-new-in-cassandra-2-1-a-better-implementation-of-counters 您仍然可以超過或低於計數根據您的重試策略超時。所以要小心,用例允許有一些不完善之處。 – phact