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

最佳答案

通常,当构造应用程序以使用参与者时,必须标识应用程序的并发特性,这可能很难掌握。您确定了5个并发“服务”:
起点
登录方式
注销网关
停止
订阅
1、4和5似乎是可以在系统中流动的消息类型,2和3我不知道如何描述。你的要点很大,我不太清楚,但看起来你有某种消息队列系统。用户可以采取的操作包括:
登录系统
注销系统
订阅消息队列
我假设登录和注销需要一些验证步骤。我将进一步假设,如果用户的身份验证步骤失败,则其连接将断开,但创建连接不足以进行身份验证。
系统采取的操作包括:
处理用户操作
将消息路由到队列的订阅者
如果这不是普遍的事实,让我知道,我会改变这个答案。(我假设发送给用户的消息不是由用户生成的,而是系统固有的一部分;也许我们正在讨论监视服务。)总之,这里并发的是什么?有几件事:
用户相互独立
队列具有不同的状态
基于actor的体系结构将每个并发实体表示为自己的流程。用户是一个有限状态机,它验证、订阅队列,或者接收消息并订阅更多队列,最后断开连接。在erlang/otp中,我们用gen_fsm来表示。用户进程携带与客户机交互所需的所有状态,如果我们通过网络公开服务,则该状态将是一个套接字。
身份验证意味着系统本身就是一个“进程”,不过,很可能它实际上是一个进程集合,在erlang/otp中我们称之为application。我离题了。为了简化,我们假设系统本身是一个单独的进程,它具有一些定义良好的协议和保存用户凭据的状态。因此,用户登录是从用户进程到系统进程的定义良好的消息及其响应。如果没有身份验证,我们就不需要系统进程,因为与用户相关的唯一状态是套接字。
细心的读者会问我们在哪里接受每个用户的套接字连接?啊,好问题。这里还有一个并发实体,我们称之为侦听器。这是另一个进程,它只监听连接,为每个新建立的套接字创建一个用户,并将所有权移交给新的用户进程,然后循环回监听。
队列也是一个有限状态机。从开始状态开始,它通过定义良好的协议接受用户订阅请求,向订阅者广播消息或接受来自用户进程的取消订阅请求。这意味着队列有一个用户进程的内部存储,用户进程的详细信息非常依赖于语言和需求。例如,在erlang/otp中,每个队列进程都是一个gen_server进程,它将用户进程id(或pids)存储在一个列表中,对于要传输的每个消息,只需对列表中的每个用户进程执行多次发送。
(在erlang/otp中,我们需要用户主管来确保进程保持活动状态,并在进程死亡时重新启动,这大大简化了erlang开发人员为确保基于actor的体系结构的可靠性而必须做的工作量。)
基本上,为了重述Joe所写的内容,基于Actor的架构可以归结为以下几点:
识别系统中的并发实体,并在流程实现中表示它们,
决定进程将如何发送消息(在erlang/otp中是一个基本操作,但必须用c或ruby显式实现的操作)和
在系统中隐藏状态修改的实体之间创建定义良好的协议。
有人说,互联网是世界上最成功的基于演员的架构,真的,这并不遥远。

关于ruby - 如何设计和构建使用Actor的程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18364249/

10-09 07:35
查看更多