2017-09-27 57 views
0

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

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

回答

0

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

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

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

+1

对不起,@ ignasi35你用不同的方式理解我的问题,我已经更新了这个问题。 –

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将自动地批量执行这些语句。

+0

谢谢@pazustep 请你也可以分享样本Scala代码吗?并且它会支持不变性,因为我们通过调用'batch.add(..)'来更改同一对象中的数据? –