4

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

所有代码都被构造为级联事件,中间有过滤器、聚合等。

最初该系统是用 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 的特定用例?它们是否具有独特的功能?还是它们最终只是围绕事件的句法帮助?

4

1 回答 1

3

尽可能简化:

邮箱

这是演员模型的最小实现。您将消息发布到队列,然后您的循环从队列中一一读取消息。也许它会发布到另一个邮箱,或者它对消息做一些事情。

  • 任何动作都只能在收到消息时发生。
  • 发布到队列是非阻塞的,即没有背压。
  • 所有异常都被捕获并作为邮箱上的事件公开。他们预计将由它上面的演员处理。
  • 其他参与者框架提供了监管者、合同、故障转移等功能。

活动

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

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

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

可观察的

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

  • 一个 Observable 发出一系列通知,这些通知遵循这个协定:
    OnNext* (OnError|OnCompleted)+
  • 所有通知都是序列化的
  • 通知可能是同步的,也可能不是同步的。不能保证背压。
  • Observables 的价值在于它们是可组合的。
  • 一个 observable 代表一个未来的通知流,操作员采取行动来转换这个流。
  • 这种方法有时称为复杂事件处理 (CEP)。
  • 异常处理是管道的一部分,有很多组合器来处理它。
  • 您通常从不自己实现观察者。您使用组合器来设置一个管道,该管道对您想要的行为进行建模。
于 2020-05-26T19:06:51.607 回答