功能反应式编程和Actor模型如何相互关联?


30

FRP是关于通过纯函数流式传输事件和行为。Actor模型-至少在Akka中实现-是关于通过可能不纯的对象(称为actor)流式传输不可变消息(可以认为是离散事件)。

因此从表面上看,它们似乎相关。

关于它们之间的关系,我们还能说些什么?另外,对于其中哪一个可能更适合于不同的应用程序域又能说些什么呢?

Answers:


26

参与者和FRP都不都是关于流媒体的。Actor甚至不支持输出流的外部配置。

FRP的特征在于其在线性时间轴上的建模信号和事件,这使FRP行为能够以确定性的方式构成。演员的主要特点是按不确定的顺序处理消息,几乎没有任何组成属性(即,您不能将两个演员的安排视为更大的演员)。

如果您要寻求相似之处,则参与者和FRP都与lambda演算有密切的关系。两者都可以对响应人类输入的系统进行建模。两者都支持内部(本地)状态建模。

FRP通过积分或累加器(随时间折叠)来支持局部状态,而参与者模型则通过允许每个参与者针对当前消息指定下一条消息的行为来支持状态。这种对本地状态的普遍支持使得FRP和Actor都不足以进行实时编程(或程序代码的运行时升级);失去重要状态变得太容易了。

关于应用程序域:

Actors模型非常适合开放系统,我们可能希望在运行时安装或维护Actor。Actors模型也不太适合分布式系统,因为消息的不确定性排序可以使一致的实现更容易。(参与者不适合分布式系统的原因是,在发生中断时确保消息“一次且仅一次”到达非常困难,参与者也往往需要分布式GC,这很痛苦。)

FRP非常适合随时间运行的封闭系统,例如机器人控制器,音乐编程,计算玩具。确定性和组成特征使FRP比参与者更方便使用,至少在FRP可以直接为解决方案建模的情况下。事实证明,很难将FRP与效果集成在一起(很好,而不会用杂质破坏模型)。最近通过“虫洞”进行了有效的FRP的工作-有效,独特或线性地访问资源。

FRP和Actor之间还有其他模型。

由John Paul Morrison开发的基于流的编程(FBP)确实支持消息流。

时间扭曲协议(或有关轻量级时间扭曲(LTW)的最新工作)将类似参与者的消息放置在逻辑时间轴上,以提供消息传递的更可控且更复杂的概念。时间扭曲通常用于大型并行和分布式系统,例如科学计算。最初的时间扭曲不适用于交互式模拟(对人类输入的响应),而LTW仅勉强适用。

我正在开发反应式需求编程(RDP),它可以在开放式和分布式系统中实现响应式,组合式,类似于FRP的信号处理和处理,并消除本地状态。RDP是通过将副作用限制为随时间变化的信号对资源状态的可交换,等幂影响。RDP需要重新考虑资源和状态模型。


我对FRP感到不满意的一件事是,在事件上映射函数需要花费有限的时间,但是FRP会将结果事件视为与原始事件同时发生。这可能会导致FRP的内部时间概念与挂钟时间失调,尤其是可能导致错误地根据挂钟时间对事件进行排序。我也不喜欢那种所谓事件B能事件A发生之后,但在同一内部录时间为事件A.
罗宾·格林

1
@RobinGreen能够对事件的“瞬时”进展或转化进行建模的功能非常有用。开发人员可以通过建模上游或下游延迟自由地进行补偿。对于从属或线性类型,可以为FRP系统开发时间安全性概念(实时属性;将延迟分配为资源),这在临时系统中很难建模。
dmbarbour

@RobinGreen-关于“事件B可以在事件A之后发生,但在相同的记录时间的假设”,在瞬时或先验时间(lim(x-> 0 +)(T + x))中发生的事件的概念是“事件”抽象的普遍谬论之一。复制,拆分和合并事件流时,事件的顺序变得任意,不一致,容易丢失时间信息。(cf. Why Not Events
13年

您是否正在将RDP项目转换为Awelon项目?
CMCDragonkai 2014年

1
Awelon项目将大量使用RDP模型/范例。以类似于OOP的方式考虑RDP。编程模型对体系结构和语言设计有影响,但我称之为“项目”不是。
2014年

7

我想从实际的角度指出它们的不同之处:

1)参与者将消息发送给其他参与者,此消息传递被明确和命令性地描述。

例如:

send msg to Actor137

2)在FRP中,对数据流进行了声明式描述:

例如:

Cell134=Cell185+Cell42

消息传递是由FRP框架处理的,您不必“手动”描述如何将消息从一个单元(类似地传递给Actor,封装状态,又称为行为)传递给另一个单元。

换一种说法:

函数式反应式编程的本质是在声明时完全指定值的动态行为。因此,所有的依赖项Cell134都在声明点定义。

这是不正确的角色模型。在A定义参与者的源代码中没有在同一位置定义影响参与者行为的参与者A

最近,我注意到两者之间有一个有趣的混合体:Akka流,其中以声明的方式描述了数据流,但使用参与者来实现。

另一个区别是:演员倾向于异步,而FRP倾向于同步(通常没有毛刺)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.