2016-01-22 127 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