在Joe Armstrong 的论文中,他指出应该通过以下三个步骤来设计基于 Actor 的程序。问题是,我不明白这些步骤如何映射到现实世界的问题或如何应用它们。这是乔的原始建议。
- 我们在现实世界的活动中识别出所有真正并发的活动。
- 我们识别并发活动之间的所有消息通道。
- 我们写下所有可以在不同消息通道上流动的消息。现在我们编写程序。程序的结构应该完全遵循问题的结构。在我们的编程语言中,每个现实世界的并发活动都应该映射到一个准确的并发进程上。如果问题与程序有 1:1 的映射,我们就说程序与问题同构。
映射恰好是 1:1,这一点非常重要。这样做的原因是它最小化了问题和解决方案之间的概念差距。如果这个映射不是 1:1,程序会很快退化,变得难以理解。当使用非 CO 语言解决并发问题时,通常会观察到这种退化。通常,让程序工作的唯一方法是强制几个独立的活动由同一个语言线程或进程控制。这导致不可避免的清晰度损失,并使程序受到复杂且不可重现的干扰错误的影响。
我认为#1很容易弄清楚。这是我迷路的#2(和3)。为了说明我的挫败感,我删除了这个 gist 中提供的一个小服务(带有回调的 Ruby 服务)。
查看该示例服务,我可以看到如何回答 #1。我们有 5 个并发服务。
- 开始
- 登录网关
- 注销网关
- 停止
- 订阅
根据服务所处的状态,其中一些服务不起作用(或不应该)。如果服务尚未启动,那么登录/注销/订阅就没有任何意义。这种状态信息与乔的 3 步有什么关系吗?
无论如何,鉴于该要点中的示例/模拟服务,我想知道有人将如何设计一个程序以以 Actory 方式包装该服务。我只想查看有关如何应用 Joe 的 3 个步骤的指南列表。编写一些代码(任何语言)的奖励积分。