Actors 模型看起来很像人们一起工作。它基于消息传递,但还有更多内容,我想说并非所有消息传递模型都是相同的,例如Quasar实际上不仅支持类似 Erlang 的演员,还支持更简单的类似 Go 的通道但不提供容错模型(顺便说一句,纤维就像线程一样,但更轻量级,即使完全没有任何消息传递也可以使用)。
方法/函数遵循严格的、可嵌套的调用-返回(即请求-响应)规则,通常不涉及任何并发性(至少在命令式和非纯函数式语言中)。
相反,从广义上讲,消息传递允许更松散的耦合,因为它不强制执行请求-响应规则并允许通信方同时执行,这也有助于隔离故障、热升级和一般维护(例如,Actor模型提供这些功能)。通常,消息传递还可以通过对消息使用更动态的类型来允许更松散的数据契约(这对于 Actors 模型尤其如此,其中每一方或Actor都有一个传入通道,即他的邮箱)。除此之外,细节很大程度上取决于您正在考虑的消息传递模型/解决方案,例如通信渠道可以同步交互部分或具有有限/无限缓冲,允许多个源和/或多个生产者和消费者等。
请注意,RPC实际上是消息传递,但具有严格的请求-响应通信规则。
这意味着,根据情况,其中一个可能更适合您:当您处于调用返回规则和/或您只是使您的顺序代码更加模块化时,方法/函数会更好。当您需要一个潜在并发的、自治的“代理”网络进行通信但不一定在请求-响应规则中时,消息传递会更好。
至于演员模型,我认为你可以通过阅读这篇博文的第一部分来建立更多的见解(注意:我是这篇文章的主要作者,我是平行宇宙和类星体的一部分 -开发团队):
演员模型是一种容错和高度可扩展系统的设计模式。Actor 是独立的工作模块,仅通过消息传递与其他 Actor 进行通信,可以与其他 Actor 隔离失败,但可以监视其他 Actor 的故障并在发生这种情况时采取一些恢复措施。Actor 是简单、孤立但协调的并发工作者。
基于 Actor 的设计带来了很多好处:
- 自适应行为:仅通过消息队列进行交互使参与者松散耦合并允许他们:
- 隔离故障:邮箱正在解耦消息队列,允许参与者重新启动而不会中断服务。
- 管理进化:它们可以在不中断服务的情况下更换演员。
- 调节并发:经常接收消息并丢弃溢出,或者增加邮箱大小可以最大化并发,但分别以可靠性或内存使用为代价。
- 调节负载:减少接听电话的频率和使用小邮箱会降低并发性并增加延迟,通过参与者系统的边界施加背压。
- 最大并发容量:
- Actors 在内存消耗和管理开销方面都非常轻量级,因此在一个盒子中甚至可以生成数百万个 Actor。
- 因为actor不共享状态,它们可以安全地并行运行。
- 低复杂度:
- 每个参与者都可以通过改变其私有状态来实现有状态行为,而不必担心并发修改。
- 参与者可以通过有选择地以逻辑而不是到达顺序从邮箱接收消息来简化他们的状态转换逻辑。