22

在 Akka.NET 中是否有处理参与者异常的标准模式?

我看到了一些创建监督者的模式,但似乎这SupervisorStrategy是一种处理演员无法解决的事情的方法。

我有一个接收大量数据并需要将其存储在外部服务器中的演员。外部数据库可能无法访问。如果是,则服务器可能正在重新启动或网络可能已关闭。我不需要重新启动演员或任何东西,我只想通知发件人一些关于正在发生的事情的信息,这样他就可以将消息保存在磁盘上并重新安排以备后用。

发件人不是连接到数据库的此参与者的父级。我是否也应该创建一个主管来处理这个问题?或者我应该将我的接收处理程序封装在 try/catch 块中,并使用Tell自定义响应来通知发件人,就好像它是一条普通消息一样?

我知道有一Failure门课,但我不确定我是否应该在这种情况下使用它。

4

1 回答 1

19

就在这里。首先,总是把危险的工作委托给儿童演员,把你所有的刀、火焰喷射器之类的东西都给他们。如果它们崩溃并燃烧,您的状态仍然完好无损,您可以产生新的孩子。

所以对于无法访问的数据库示例;启动一个 DB 通信参与者。然后你可以让这个actor有两个状态,DB up 和 DB down,这可以建模为 FSM 或使用Become/ Unbecome

因此,当消息到达并请求 DB 查询时,如果发生故障,DB 通信器参与者会将其自身置于 DB-Down 状态。如果在 DB-Down 状态下收到任何查询,您可以立即用Failure事件响应。

那么我们如何从 DB-Down 到 DB-Up 呢?DB-Communicator 参与者可以使用 ping 它自己ScheduleOnce,例如每 x 秒向它自己传递一个“CheckDBStatus”消息。当收到 CheckDBStatus 消息时,您检查 DB 是否再次启动,如果是,则恢复到 DB-Up 状态。

这样,您就不会在由于高负载而无法响应的情况下淹没数据库,在这种情况下增加更多负载只会让事情变得更糟。所以这种断路器可以防止这种情况发生。

简而言之:

在 DB-Up 状态:

如果收到 DBQuery 消息,请尝试运行查询,然后发回响应。如果发生故障,直接进入 DB-Down 状态并以失败事件响应。

在 DB-Down 状态下:如果接收到 DBQuery 消息,则Failure直接响应事件而不接触 DB。每 x 秒对自己执行一次 Ping 以查看 DB 是否已启动,并在可能的情况下恢复到 DB-Up 状态。

在这种情况下,您不会使用任何主管来传输状态,正常的 try/catch 就足以处理这个问题。

希望这能把事情弄清楚。

于 2015-02-08T07:08:47.127 回答