【发布时间】:2012-12-17 03:04:47
【问题描述】:
场景
应用程序的数据库已关闭。这会导致任何负责将重要数据提交到数据库的参与者无法获得连接
首选行为
重要数据会在未来某个时间恢复时写入数据库。
当前实施
Actor 捕获 DBException,将数据包装在 DBWriteFailed 案例类中,并将消息发送给其主管。然后,主管使用 system.scheduler.scheduleOnce(...) 在未来某个时间(例如 1 分钟)安排另一次写入,这样我们就不会在等待数据库恢复时绕圈子太多。
这个实现确实有效,但我觉得可能有更好的方法。
- 当提交参与者必须在成功提交后响应原始发件人时,协议会变得有点混乱。
- 发送到提交 Actor 的常规消息流不会以任何方式受到限制,并且 Actor 会愉快地处理新消息,可能无法为每条消息连接到数据库。
- 如果消息在此重试循环中被捕获的时间过长,提交参与者的邮箱将开始膨胀。提交这些数据很重要,但如果应用程序因内存使用过多而停止或崩溃,这些都无关紧要。
我是一名 akka 新手,在主管策略方面我基本上没有经验,但我觉得我可以利用其中一个来处理一些重试逻辑。
akka 中是否有解决此类问题的通用方法?我是在正确的轨道上还是应该朝着不同的方向前进?
感谢任何帮助。
【问题讨论】: