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

首选行为
将来某个时候备份重要数据时,会将其写入数据库。

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

这个实现当然可以,但是我觉得可能会有更好的方法。

  • 当提交的参与者在成功提交之后必须响应原始发件人时,协议(protocol)会变得有点困惑。
  • 不会以任何方式限制到提交参与者的常规消息流,并且参与者将愉快地处理新消息,可能无法为每个消息都连接到DB。
  • 如果邮件在此重试循环中被捕获的时间过长,则执行方的邮箱将开始膨胀。提交此数据很重要,但是如果应用程序由于过多的内存使用而停止爬网或崩溃,则无关紧要。

  • 我是一个客气的新手,在主管策略方面我经验不足,但是我觉得我也许可以利用其中的一种来处理某些重试逻辑。

    Akka是否有解决此类问题的通用方法?我是在正确的道路上还是应该朝着不同的方向前进?

    任何帮助表示赞赏。

    最佳答案

    您可以使用Akka Circuit Breaker减少连接尝试。而不是使用调度程序作为重试队列,我将在actor内使用一个缓冲区(具有最大大小限制),并在断路器再次闭合时重试那些缓冲区(onClose回调应将消息发送给self actor)。另一种选择是将断路器与stashing mailbox组合在一起。

    关于database - Akka Actor : Handling DB Failures Without Losing Data,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13907764/

    10-13 07:36