【问题标题】:Async cassandra queries异步 cassandra 查询
【发布时间】:2019-04-14 23:06:57
【问题描述】:

我一直在尝试更新应用以提高性能,它使用 Datastax Cassandra Java 驱动程序来提供 DAL 服务。

现在,我需要将同步查询转换为异步查询,我没有找到满意的答案(至少在我访问的网页上没有)。

谁能回答以下问题或参考我可以得到答案的链接。

1> 在将同步执行更改为异步执行之前,我需要担心哪些可能的问题场景?

2> 读写行为如何,我可以更改其中一个而不担心任何问题吗?

提前致谢!

【问题讨论】:

标签: asynchronous cassandra cassandra-2.0 datastax-java-driver


【解决方案1】:

您需要考虑几件事:

  • 您需要对代码进行速率限制 - 默认情况下,每个连接只有 1024 个请求,因此您可能需要increase this number。但即使每个连接的请求数量增加,Cassandra 也很容易过载,因此您仍然需要控制它,例如 this;
  • 您需要正确处理错误 - 您可能需要将错误处理程序添加到返回的 Promise 中,并做出相应的反应;
  • 您需要正确创建语句 - 例如,不要重复使用相同的 BoundStatement,因为它不是线程安全的;
  • 不要重复使用作为参数等传递的相同 List/Set/Map 实例。

【讨论】:

  • 感谢 Alex,还有一件事,考虑到批处理保持原子性,将批处理语句与 executeAsync 配对究竟如何工作。我可以将它们结合起来以获得更好的性能而不会失去原子性吗?
  • 有不同类型的批处理 - 你可以为多个表批处理,你可以为同一个表批处理,等等。如果你为表内的同一个分区批处理,那么它比发送相同的查询要快得多次。但除此之外,使用 executeAsync 的批次与 execute 的使用相同...
  • 太棒了!说得很清楚,在我的情况下,批处理是针对多个表的,所以我认为使用 executeAsync 是没用的。
  • 为什么,它仍然很有用,因为您仍然可以并行执行,而无需添加更多线程。但是您确实需要考虑使用批次 - 它们非常昂贵,并且只能在有限的情况下使用
  • 使用批处理来保证事务的原子性。我编写的初始代码是以异步方式处理批处理。我有多个事务,每个事务都有一组 upsert。因此,我不是以同步方式为每个批处理执行批处理,而是尝试对每个批处理使用异步来获得更好的性能。有道理,对吧?
猜你喜欢
  • 2015-02-05
  • 2018-02-04
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
相关资源
最近更新 更多