【问题标题】:cassandra - high concurrency read-write app problemscassandra - 高并发读写应用程序问题
【发布时间】:2014-06-21 11:23:20
【问题描述】:

我正在实现一个应用程序,它在 4 个线程中生成数十万行。每个线程打开一个到 cassandra 的单独连接。

表的每一项都有一个唯一的哈希标识符(String),但主键是一个uuid。

item持久化的过程如下:

1) 创建项目并计算其哈希值。 2) 然后在第二个表中执行散列查找,该表将散列对应于项目的 uuid。 3) 如果找到一个哈希 - uuid 对,则正在执行对项目 uuid 的查找(再次是第一个表),并且由于该项目必须存在(因为找到了一个“哈希 - uuid”对),所以从加载项目cassandra 到 JPA,然后更新。当没有找到“hash - uuid”对时,在相应的表中创建一个新项目,并保存一个新的“hash - uuid”对。

数据生成有两个步骤。第一步是使用空表运行并生成第一个数据集。那里没有错误发生,因为在步骤 nr. 3,从未找到“hash - uuid”对,因此不会发生更新。

在第二步中,整个算法再次运行,但已经在填充的数据表上运行。在此步骤中,通过相应的 uuid(主键)读取数据项时会发生随机错误 - 有时服务器不会返回完整的文本数据(正确的 JSON 字符串存储在表中,但不完整的 JSON 字符串会检索到应用程序中)。

我完全确定我的算法是正确的,因为相同的算法适用于 hibernate 和 mysql,甚至适用于 postgresql(但由于我需要更快的写入,我正在使用 cassandra)。

我正在使用具有 16 GB RAM 的 macbook pro,为了与 cassandra 一起工作,我使用 Kundera 库(支持 JPA)。至于cassandra,我试过datastax 2.0.4版本,还有直接从Apache网站下载的2.0.7版本。没有集群,只有一个实例在我的机器上本地运行,在外部 SSD 驱动器上。 Kundera 正在使用 CQL v3。

有人知道这种行为是如何发生的吗? datastax cassandra 驱动程序或 Kundera 中是否存在错误?还是我使用 cassandra 错误并且不应该以这种方式使用数据库?或者有什么我可能忘记的配置调整?

我在 cassandra 配置文件中唯一更改的是所有超时,因为我收到了太多默认值的 TimeoutExceptions(在主键查找期间发生超时)

【问题讨论】:

标签: java jpa cassandra cassandra-2.0 kundera


【解决方案1】:

我怀疑您的代码没有以线程安全的方式使用 Cassandra 连接:必须注意一次只允许一个线程访问连接。我不知道 Kundera 是如何解决这个问题的,因为 JPA 会为 Cassandra 生成非常低效的查询,我不推荐它。请参阅data modeling resources here,并使用native CQL java driver

【讨论】:

  • 感谢您的回答,这正是我所怀疑的。查询生成没有问题,因为即使使用 JPA,查询也只是基本的主键查找。我怀疑问题出在昆德拉身上,我只是想确定一下,我没有做任何不应该由 cassandra 以我正在做的方式处理的数据操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多