我正在使用带有数据存储驱动程序的Cassandra数据库。我需要从Cassandra批量读取2000行的顺序。我的用例就像是,我在我的请求中得到了id列表,那些id是我在Cassandra中的分区键。我想知道生成2000个线程并从Cassandra并行获取数据是一个好主意(在这种情况下,只读取一个节点时读取数据会有效)或者是否有可能找到一种方法来对ID进行分组住在同一个节点,以便我可以优化读取(现在在这种情况下,我需要在Cassandra上产生更少的线程和更少的开销)。请让我知道除了产生多个线程之外,我能否以有效的方式实现批量读取。谢谢! PS:从Cassandra回来的数据并不会导致OOM。
答案 0 :(得分:2)
是否有可能找到一种方法来对生活在同一节点中的ID进行分组
是的,您可以get Token Ranges获取cassandra群集,check occurrence for tokens获取范围内的ID,然后按节点分组ID。
另外:
没有必要产生许多线程,数据存储驱动程序提供asynchronous api,我们在项目中使用它来并行执行大量查询并且它工作得很好,但从性能的角度来看并不是很好。
执行数千次读取数据请求的必要性表明不合适的数据模型。您应该围绕查询实现数据模型,以最大限度地减少请求以获得良好性能。
<强>更新强>
我想,你可以使用方法 Metadata.newToken计算驱动程序端的令牌或直接获取Metadata.getReplicas的副本以获取给定的分区键。 但在serialize the partition key之前根据其类型和协议版本