如何处理演员内部的异常?
How to handle exceptions within the actor?
在 Akka.NET 中是否有处理 actor 异常的标准模式?
我看到了一些创建监督者的模式,但是 SupervisorStrategy
似乎是一种处理 actor 无法解决的事情的方法。
我有一个 actor 接收大量数据并需要将其存储在外部服务器中。外部数据库可能无法访问。如果是,则服务器可能正在重新启动或网络可能已关闭。我不需要重启 actor 或其他任何东西,我只是想用一些关于正在发生的事情的信息通知发送者,这样他就可以将消息保存在磁盘上并重新安排以后使用。
发件人不是此连接到数据库的参与者的父级。我是否也应该创建一个主管来处理这个问题?或者我应该将我的接收处理程序封装在 try/catch 块中,然后只使用 Tell
来通知发件人 a 自定义响应,就好像它是一条普通消息一样?
我知道有一个 Failure
class,但我不确定我是否应该在这种情况下使用它。
是的。
首先,总是将危险的工作委派给 child 演员,把你所有的刀、火焰喷射器等都交给他们。如果它们崩溃并燃烧,你的状态仍然完好无损,你可以产生新的 children.
所以对于无法访问的数据库示例;
启动一个 DB-communication 演员。
然后你可以让这个 actor 有两个状态,DB up 和 DB down,这可以建模为 FSM 或使用 Become
/Unbecome
.
因此,当消息到达并请求数据库查询时,如果事情爆炸,数据库通信器参与者会将其自身置于 DB-Down 状态。
如果在 DB-Down 状态下收到任何查询,您可以立即响应 Failure
事件。
那么我们如何从 DB-Down 再次转到 DB-Up?
DB-Communicator actor 可以使用 ScheduleOnce
自行 ping 它,例如每 x 秒向它自己传递一条 "CheckDBStatus" 消息。
当收到 CheckDBStatus 消息时,您检查 DB 是否再次启动,如果是,则恢复到 DB-Up 状态。
这样,您就不会在由于高负载而无法响应的情况下淹没您的数据库,在这种情况下增加更多的负载只会让事情变得更糟。
所以这种断路器将防止这种情况发生。
简而言之:
处于DB-Up状态:
如果收到 DBQuery 消息,请尝试 运行 查询,然后发回响应。
如果事情爆炸了,直接进入 DB-Down 状态并用失败事件响应。
处于DB-Down状态:
如果收到 DBQuery 消息,则直接响应 Failure
事件 w/o 接触数据库。
每隔 x 秒 ping 一次自己,看看数据库是否启动,如果可能,恢复到 DB-Up 状态。
在这种情况下,你不会使用任何监督者来转移状态,正常的try/catch就足以处理这个问题。
希望这一切都清楚了。
在 Akka.NET 中是否有处理 actor 异常的标准模式?
我看到了一些创建监督者的模式,但是 SupervisorStrategy
似乎是一种处理 actor 无法解决的事情的方法。
我有一个 actor 接收大量数据并需要将其存储在外部服务器中。外部数据库可能无法访问。如果是,则服务器可能正在重新启动或网络可能已关闭。我不需要重启 actor 或其他任何东西,我只是想用一些关于正在发生的事情的信息通知发送者,这样他就可以将消息保存在磁盘上并重新安排以后使用。
发件人不是此连接到数据库的参与者的父级。我是否也应该创建一个主管来处理这个问题?或者我应该将我的接收处理程序封装在 try/catch 块中,然后只使用 Tell
来通知发件人 a 自定义响应,就好像它是一条普通消息一样?
我知道有一个 Failure
class,但我不确定我是否应该在这种情况下使用它。
是的。 首先,总是将危险的工作委派给 child 演员,把你所有的刀、火焰喷射器等都交给他们。如果它们崩溃并燃烧,你的状态仍然完好无损,你可以产生新的 children.
所以对于无法访问的数据库示例;
启动一个 DB-communication 演员。
然后你可以让这个 actor 有两个状态,DB up 和 DB down,这可以建模为 FSM 或使用 Become
/Unbecome
.
因此,当消息到达并请求数据库查询时,如果事情爆炸,数据库通信器参与者会将其自身置于 DB-Down 状态。
如果在 DB-Down 状态下收到任何查询,您可以立即响应 Failure
事件。
那么我们如何从 DB-Down 再次转到 DB-Up?
DB-Communicator actor 可以使用 ScheduleOnce
自行 ping 它,例如每 x 秒向它自己传递一条 "CheckDBStatus" 消息。
当收到 CheckDBStatus 消息时,您检查 DB 是否再次启动,如果是,则恢复到 DB-Up 状态。
这样,您就不会在由于高负载而无法响应的情况下淹没您的数据库,在这种情况下增加更多的负载只会让事情变得更糟。 所以这种断路器将防止这种情况发生。
简而言之:
处于DB-Up状态:
如果收到 DBQuery 消息,请尝试 运行 查询,然后发回响应。 如果事情爆炸了,直接进入 DB-Down 状态并用失败事件响应。
处于DB-Down状态:
如果收到 DBQuery 消息,则直接响应 Failure
事件 w/o 接触数据库。
每隔 x 秒 ping 一次自己,看看数据库是否启动,如果可能,恢复到 DB-Up 状态。
在这种情况下,你不会使用任何监督者来转移状态,正常的try/catch就足以处理这个问题。
希望这一切都清楚了。