Akka Actors:在不丢失数据的情况下处理数据库故障

Jak*_*ene 11 database scala actor akka

场景
应用程序的数据库已关闭.这导致任何负责将重要数据提交给DB的任何actor都无法获得连接

首选行为
重要数据在将来某个时间重新启动时写入数据库.

当前实现
actor捕获DBException,将数据包装在DBWriteFailed案例类中,并将消息发送给其主管.然后,主管使用system.scheduler.scheduleOnce(...)在将来某个时间(例如1分钟)安排另一次写入,这样我们就不会在等待DB重新启动时过多旋转.

这种实现肯定有效,但我觉得可能有更好的方法.

  • 当提交的actor在成功提交后必须响应原始发送者时,协议会变得有点麻烦.
  • 对提交actor的常规消息流不会受到任何限制,并且actor会愉快地处理新消息,可能无法连接到每个消息的DB.
  • 如果消息在此重试循环中被捕获的时间过长,则提交的actor的邮箱将开始出现气球.提交此数据非常重要,但如果应用程序因内存使用过多而导致停止或崩溃,则无关紧要.

我是akka新手,在涉及主管策略方面,我基本缺乏经验,但我觉得我可以利用其中一个来处理一些重试逻辑.

在akka中有一个共同的方法来解决这样的问题吗?我是在正确的轨道上还是我应该向不同的方向前进?

任何帮助表示赞赏.

Pat*_*all 9

您可以使用Akka Circuit Breaker来减少连接尝试.不使用调度程序作为重试队列,我将在actor内部使用缓冲区(具有最大大小限制),并在断路器再次关闭时重试那些(onClose回调应该向自己的actor发送消息).另一种方法是将断路器与存储结合使用.