结合演员模型 RESTful API

Combine actor model with RESTful API

我研究 actor 模型已经有一段时间了,并试图弄清楚如何将它与 RESTful API 正确地结合起来。我正在努力如何通过使用询问模式或 actor-per-request 来分离两层的职责。对于这两种模式,请求-回复语义都会泄漏到参与者模型中,这看起来像是一种反模式。大多数由 HTTP 请求发起、发送给参与者的消息都需要回复。接收参与者有多个条件,它需要发出信号 API 它无法满足请求。

此外,关于输入验证的良好做法是什么?这是否应该作为 HTTP 的一部分实现(例如,如果字段 X 是一个有效的电子邮件地址,如果字段 Y 包含一个整数)。对于复杂的域逻辑,how/should 参与者在(前置)条件失败时通知发送者?

虽然 request/reply 是参与者间通信中的一种反模式,但没有什么可以阻止您从参与者系统外部使用它。您可以从那里使用 Ask 并使用 Forward + Tell 的组合返回原始发件人发送回复,而不必在演员内部使用 request/reply 模型。

当涉及到输入验证时,可以在 Web 框架级别轻松完成简单的验证(字段存在、电子邮件格式等)。然而,更高级的情况(如权限管理)可能会使用参与者 - 至少如果您的业务逻辑也使用它们。

对于复杂的场景——尝试用协议来思考。描述参与者 and/or 外部服务之间的一组契约,并使用消息来控制您的逻辑流。这种推理通常很难描述,但通常很容易用铅笔画出来;)

即您可能决定使用某种 AuthorizationGate actor,它会在给定未经授权的请求时对其进行验证:在身份验证失败时,它会将一些 RequestFailed 消息发回给原始发件人(提问者),在成功时可以将该消息转换为 ValidRequest 并将其发送给负责处理该消息类型的参与者。然后一个 actor(只处理有效请求)处理它,将 RequestSucceedRequestFailed 发送回原始发件人(记住要么将该发件人存储为消息字段,要么使用 actorRef.Forward 而不是actorRef.Tell 所以你不要覆盖它)。