在Lagom-Scala Cassandra读取批量插入

时间:2017-09-27 04:13:53

标签: scala cassandra akka lagom

我在谷歌搜索但除了Cassandra阅读文档页面之外没有任何链接。所以,我只想询问Akka-Cassandra包中是否已经包含任何API或函数用于批量行插入,或者我必须多次调用插入代码以进行多行插入。

注意: - 我不是要求插入多个事件,我只是想以密钥对格式存储一些json数据。因此,包含Json对象的单个事件可能需要多行。在PHP和其他语言中,我们可以提供一个包含多行的数组,但是Akka的Cassandra驱动程序实现如何提供呢?

2 个答案:

答案 0 :(得分:0)

Lagom的Read Side一次处理一个事件。可以批量插入的唯一方案是将事件保留在内存中并将批处理超过超时或设置足够大。这种方法容易导致数据丢失(或最多一次语义),因为在崩溃的情况下,事件流将考虑消耗的事件,但内存中的数据将不会被持久化。

Lagom默认值使每个事件处理单个事务,其中包括用户提供的代码以更新读取端表和lagom中的偏移存储。当用户提供的所有操作都发生在事务中时,这种方法可以有效地进行一次读取处理。

目前建议的方法是对持久化实体标记进行分片,以便可以并行地从许多读取端处理器实例中使用持久性实体事件流。使用该解决方案,每个实例将一次处理一个事件,但许多实例将分布在您的集群中。

答案 1 :(得分:0)

CassandraSession公开批量写入所需的一切,即CassandraSession#prepare后跟CassandraSession#executeWriteBatch

这样的事情:

PreparedStatement ps = session.prepare(...);
BatchStatement batch = new BatchStatement();
batch.add(ps.bind(...));
batch.add(ps.bind(...));
session.executeWriteBatch(batch);

也就是说,注意使用CassandraReadSide构建的读取边处理程序需要从事件处理程序方法返回List<BoundStatement>。 Lagom将自动批量执行这些语句。