我们有一个使用akka-persistence-cassandra来存储传入事件的多节点Web应用程序。最近有人告诉我们,我们的应用程序每天要从cassandra messages
和metadata
表中进行近280万次读取。(结合使用)我知道需要从messages
表中进行读取,但是我仍然无法弄清楚为什么我们需要从metadata
表中读取内容。
让我们看看akka-persistence-cassandra api(2.11-0.59)。这是元数据表上唯一的读取查询
def selectDeletedTo = s"""
SELECT deleted_to FROM ${metadataTableName} WHERE
persistence_id = ?
"""
CassandraJournal
类实现了asyncReadHighestSequenceNr:
override def asyncReadHighestSequenceNr(persistenceId: String, fromSequenceNr: Long): Future[Long] = {
writeInProgress.get(persistenceId) match {
case null => super.asyncReadHighestSequenceNr(persistenceId, fromSequenceNr)
case f => f.flatMap(_ => super.asyncReadHighestSequenceNr(persistenceId, fromSequenceNr))
}
}
override def asyncReadHighestSequenceNr(persistenceId: String, fromSequenceNr: Long): Future[Long] =
asyncHighestDeletedSequenceNumber(persistenceId).flatMap { h =>
asyncFindHighestSequenceNr(persistenceId, math.max(fromSequenceNr, h))
}
因此,从上述声明中我可以理解,akka首先需要读取元数据表以获取已删除的计数,然后使用该计数来获取最高的序列号。
但是,在我的应用程序中,我从未删除任何消息,因此metadata
表始终为空。因此,math.max(fromSequenceNr, h)
始终将来自fromSequenceNr。
因此,我正在考虑重写asyncReadHighestSequenceNr
方法并删除调用以读取已删除的最高序列号。那应该节省了我对metadata
表的所有额外调用。.
任何评论,想法听起来如何?