F# 循环依赖与消息处理

F# cyclic dependencies with message processing

我正在尝试使用具有跨消息传递的复杂逻辑的 actor 模型构建系统,因此有一个 actor 从一开始就发送消息并侦听传入的响应。此外,消息传递使用例如 UDP 数据报完成。

因此,鉴于 actor 取决于消息 sender,这意味着系统必须首先创建消息 sender。为了将传入的消息传递给 actor,消息 listener 必须依赖于 actor(它做类似 actor.Post incomingMessage 的事情)。

问题是关于初始化顺序:似乎我应该首先创建 sender,然后是 actor,最后是 listener,但是如果系统将以这种方式构建,当 actor 已经发送消息并监听回复,但监听器尚未初始化时,可能会丢失传入消息。当然,UDP也是不可靠的传输方式,可能会丢失一些消息,因此有一些机制可以防止系统故障。但就我而言,总体设计似乎已被打破。是否有任何解决方案或不同的设计原则?

通常,您在执行任何可能导致消息开始到达的操作之前,先整理出响应消息的机制。因此,如果您只希望它们在您已经发送某些消息时出现,请在配置侦听器之前不要发送任何这些消息。

actor 应该等到一切就绪后才能开始正常操作。

当然,不可能总是 100% 确定这一点,因为您通常无法判断消息总线上是否正在监听您可能期望监听的任何其他内容,但如果这很重要,那么定义一些不同参与者可以用来验证其他参与者是否已准备好在事情开始之前开始的消息并不是不合理的。

或者,您可以使用消息总线实现来存储消息,直到侦听器主动检索它们。这允许在没有侦听器存在的情况下发送消息而不会丢失消息,但是如果侦听器不检索它们,消息队列的大小会增加可能会出现问题。