akka-persistence-cassandra从元数据表中读取过多

时间:2018-06-20 17:46:03

标签: scala optimization cassandra akka akka-persistence

我们有一个使用akka-persistence-cassandra来存储传入事件的多节点Web应用程序。最近有人告诉我们,我们的应用程序每天要从cassandra messagesmetadata表中进行近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表的所有额外调用。.

任何评论,想法听起来如何?

0 个答案:

没有答案