澄清 F# 中的事件、观察者与邮箱处理器



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

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

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

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

我读了这个:观察者模式和事件驱动方法之间的区别,我没有明白,但显然超过150人投票认为答案不太清楚:)

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

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

  • 邮箱处理器真的是正在使用的东西吗? 它似乎主要出现在较旧的文档中,并且在我使用的软件包中,我没有遇到任何使用它的人

  • 关于观察者模式,在我们使用的大量包中,只有一个包在内部使用它,但其他一切都只是使用基本事件。

是否有适合可观察模式和邮箱处理器的特定用例?它们是否具有独特的功能?或者它们最终只是围绕事件的语法帮助?

尽可能简化:

邮箱

这是执行组件模型的最小实现。 将消息发布到队列,循环会逐个读取队列中的消息。也许它会发布到另一个邮箱,或者对邮件执行某些操作。

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

事件

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

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

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

可观察量

有一个源(可观察(,你可以使用接收器(观察者(订阅它。可观察量表示有界或无界的值流。无限流(永不完成的可观察量(似乎类似于事件,但可观察量有几个重要的属性。

  • 可观察量发出一系列通知,这些通知遵循以下协定:
OnNext* (OnError|OnCompleted)+
  • 所有通知都序列化
  • 通知可能是同步的,也可能不是同步的。不能保证背压。
  • 可观察量的价值在于它们是可组合的。
  • 可观察量表示未来通知流,操作员会执行转换此流的操作。
  • 此方法有时称为复杂事件处理 (CEP(。
  • 异常处理是管道的一部分,有许多组合器来处理它。
  • 您通常从不自己实现观察器。您可以使用组合器来设置管道,该管道对所需行为进行建模。

相关内容

  • 没有找到相关文章

最新更新