就在这里。首先,总是把危险的工作委托给儿童演员,把你所有的刀、火焰喷射器之类的东西都给他们。如果它们崩溃并燃烧,您的状态仍然完好无损,您可以产生新的孩子。
所以对于无法访问的数据库示例;启动一个 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 就足以处理这个问题。
希望这能把事情弄清楚。