【问题标题】:How to persist actor state with high rate of messages如何以高消息率保持参与者状态
【发布时间】:2015-02-03 15:27:36
【问题描述】:

我想开始使用带有大量消息的演员。演员的最后状态很重要 我正在关注此处显示的持久性示例http://doc.akka.io/docs/akka/2.3.9/scala/persistence.html#event-sourcing 我试图发送大量消息

for (i <-0 to 100000){
  persistentActor ! Cmd("foo"+i)
}

并像这样使用persistAsync

 val receiveCommand: Receive = {
    case Cmd(data) =>
      persistAsync(Evt(s"${data}-${numEvents}"))(updateState)
    case "snap"  => saveSnapshot(state)
    case "print" => println(state)
  }

在关机之前,我添加了 Thread.sleep(150000) 以确保所有内容都持续存在。起初似乎一切正常,但是重新运行该应用程序表明有些人会死信

> [INFO] [02/03/2015 15:35:18.187]
> [example-akka.actor.default-dispatcher-3]
> [akka://example/user/persistentActor-4-scala] Message
> [java.lang.String] from Actor[akka://example/deadLetters] to
> Actor[akka://example/user/persistentActor-4-scala#1206460640] was not
> delivered. [1] dead letters encountered. This logging can be turned
> off or adjusted with configuration settings 'akka.log-dead-letters'
> and 'akka.log-dead-letters-during-shutdown'. [INFO] [02/03/2015
> 15:35:18.192] [example-akka.actor.default-dispatcher-3]
> [akka://example/user/persistentActor-4-scala] Message
> [akka.persistence.Recover] from
> Actor[akka://example/user/persistentActor-4-scala#1206460640] to
> Actor[akka://example/user/persistentActor-4-scala#1206460640] was not
> delivered. [2] dead letters encountered. This logging can be turned
> off or adjusted with configuration settings 'akka.log-dead-letters'
> and 'akka.log-dead-letters-during-shutdown'.

or getting something like :


----------
[INFO] [02/03/2015 15:54:32.732] [example-akka.actor.default-dispatcher-11] [akka://example/user/persistentActor-4-scala] Message [akka.persistence.JournalProtocol$ReplayedMessage] from Actor[akka://example/deadLetters] to Actor[akka://example/user/persistentActor-4-scala#-973984210] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
[INFO] [02/03/2015 15:54:32.735] [example-akka.actor.default-dispatcher-3] [akka://example/user/persistentActor-4-scala] Message [akka.persistence.JournalProtocol$ReplayedMessage] from Actor[akka://example/deadLetters] to Actor[akka://example/user/persistentActor-4-scala#-973984210] was not delivered. [10] dead letters encountered, no more dead letters will be logged. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
 A fatal error has been detected by the Java Runtime Environment:
  SIGSEGV (0xb) at pc=0x00007fa2a3e06b6a, pid=18870, tid=140335801857792
 JRE version: Java(TM) SE Runtime Environment (7.0_71-b14) (build 1.7.0_71-b14)
 Java VM: Java HotSpot(TM) 64-Bit Server VM (24.71-b01 mixed mode linux-amd64 compressed oops)
 Problematic frame:
 V  [libjvm.so+0x97bb6a]  Unsafe_GetNativeByte+0xaa

 Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again

 An error report file with more information is saved as:
 /home/tadmin/projects/akka-sample-persistence-scala/hs_err_pid18870.log

 If you would like to submit a bug report, please visit:
   http://bugreport.sun.com/bugreport/crash.jsp

================================================ ==========================

如何保持一个应该处理大量消息的actor的状态?

【问题讨论】:

  • 你应该看看更优雅的关机,让系统在退出之前完成它正在做的事情:letitcrash.com/post/30165507578/shutdown-patterns-in-akka-2
  • 你用的是什么数据库?
  • @cmbaxter 我正在正常关机,但是如何判断持久性过程在关机前完成?
  • @EricZoerner 持久性在日志(文件)上

标签: scala akka akka-persistence


【解决方案1】:

我怀疑默认数据库 levelDB 是问题所在,而且最肯定的是核心转储。您是否有机会同时与多个演员一起写信给数据库?以我的经验,我在那种情况下看到了它的核心转储。您可以在shared mode 中尝试,但我只是插入了一个不同的数据库,问题就消失了。就我而言,我使用了Cassandra

我会尝试使用内存日志插件来实现 akka-persistence。换入非常容易。如果问题消失了,那么您就知道 levelDB 是问题所在。如果是这样,请使用其他数据库。

【讨论】:

  • 抱歉我的回复晚了。实际上 - 不,我使用的是与示例中相同的演员。
  • 我的建议是继续使用相同的演员,但使用不同的数据库配置您的 akka-persistence。首先尝试内存中的日志插件,如果问题消失,然后使用不同的(真实的)数据库插件而不是默认的:JDBC、cassandra、mongodb 或其他。您遇到的问题是来自 LevelDB 的核心转储,这是 akka-persistence 中使用的默认数据库。
猜你喜欢
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 2019-08-23
  • 1970-01-01
  • 2017-01-31
相关资源
最近更新 更多