F# 中事件与观察者与 MailboxProcessor 的澄清

Clarification of Events vs Observer vs MailboxProcessor in F#

我有一个连接到金融市场的系统,它大量使用事件。

所有代码的结构都是事件级联,中间有过滤器、聚合等。

最初系统是用 C# 编写的,然后移植到 F#(回想起来这是一个伟大的举动),C# 代码中的事件被 F# 中的事件替换,没有考虑太多。

我听说过观察者模式,但我还没有真正经历过这个话题。最近,我通过一些随机浏览阅读了有关 F# 的邮箱处理器的信息。

我读到这个:Difference between Observer Pattern and Event-Driven Approach 但我没听懂,但显然有超过 150 人投票认为答案也不太清楚:)

在这样的文章中:https://hackernoon.com/observer-vs-pub-sub-pattern-50d3b27f838c 观察者模式似乎与事件完全相同...

乍一看,他们似乎在解决同一类问题,只是界面不同,但这让我想到了两个问题:

是否有适合 Observable 模式和 MailboxProcessor 的特定用例?它们是否具有独特的功能?还是它们最终只是围绕事件提供语法帮助?

尽可能简化:

邮箱

这是 actor model 的最小实现。 您将 post 消息发送到队列,然后循环从队列中一条一条地读取消息。也许它 post 发送到另一个邮箱或者它对邮件做了一些事情。

  • 任何操作只能在收到消息时发生。
  • 发送到队列是非阻塞的,即没有背压。
  • 所有异常都被捕获并作为邮箱事件公开。它们应该由其上方的 actor 处理。
  • 其他 actor 框架提供监管者、契约、故障转移等功能

活动

事件是一种语言支持的回调机制。

这是一个简单的实现。您注册一个回调委托,并在引发事件时调用您的委托。

  • 按添加顺序调用代理。
  • 事件是阻塞的、同步的。一个代表阻塞,其余延迟。
  • 事件是关于编写代码来响应事件,而不是之前的事件,即轮询。
  • 事件的处理程序通常是该事件的最终终点,并且通常有副作用。
  • 共享处理程序很常见。例如,十个按钮可能具有相同的处理点击的功能,因为事件的发送者是已知的。
  • 您自己处理异常,通常是在处理程序代码中

观察值

有一个源 (Observable),您可以使用接收器 (Observer) 订阅它。可观察对象表示有界或无界的值流。无界流(永远不会完成的 Observable)看起来类似于事件,但 Observable 有几个重要的属性。

  • 一个 Observable 发出一系列通知,遵循这个契约:
    OnNext* (OnError|OnCompleted)+
  • 所有通知都已序列化
  • 通知可能同步也可能不同步。无法保证背压。
  • Observables 的价值在于它们是可组合的。
  • 一个 observable 代表一个未来的通知流,运营商采取行动来转换这个流。
  • 这种方法有时称为复杂事件处理 (CEP)。
  • 异常处理是管道的一部分,有很多组合器来处理它。
  • 您通常从不自己实现观察者。您使用组合器来设置一个管道,该管道模拟您想要的行为。