1

我正在使用 Cassandra 2.1.12 将事件数据存储在列族中。下面是为 .net 创建客户端的 c# 代码,它管理来自 Cassandra 的连接。现在的问题是插入/更新数据的速率非常高。所以,现在假设我在后续请求中增加 Cassandra 中的列值。但正如我所说的插入/更新率非常高。因此,在我的 3 节点集群中,如果我第一次写入列的值是 1,那么在下一个请求中,我将读取该列的值并将其更新为 2。但是如果从其他节点获取的值没有被初始化为 1。然后值将再次存储为 1。所以,现在为了解决这个问题,我也将值保留为consistency1 QUORUM。但问题仍然存在。谁能告诉我可能的解决方案?

     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;
        }
4

1 回答 1

2

不可能在 cassandra 中实现您的目标。原因是,每个分布式应用程序都属于CAP 定理。据此, cassandra没有 Consistency

在此处输入图像描述

因此,在您的场景中,您尝试在多线程环境中多次更新相同的分区键,因此不能保证在所有线程中都能看到最新数据。如果您尝试使用小的间隔间隙,那么您可能会在所有线程中看到最新数据。如果您的要求是增加/减少整数,那么您可以使用cassandra 计数器. 但是,cassandra 计数器不支持在单个请求中检索更新的值。这意味着您可以请求增加计数器并单独请求获取更新的值。不可能在单个请求中增加和获取增加的值。如果您的要求只是增加值(例如计算页面被查看的次数),那么您可以使用 cassandra 计数器。Cassandra 计数器不会错过任何增量/减量。终于可以看到实际数据了。希望能帮助到你。

于 2016-01-22T12:49:11.973 回答