F#循环依赖与消息处理

时间:2017-08-24 10:20:37

标签: f# message-queue actor

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

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

问题是关于初始化顺序:似乎我应首先创建sender,然后actor,最后listener,但如果系统将以这种方式构建,那么当actor已经发送消息并侦听回复时,潜在的传入消息丢失,但是侦听器尚未初始化。对于cource,UDP也不是可靠的传输,并且可能丢失一些消息,因此存在一些防止系统故障的机制。但似乎总体设计在我的情况下被打破了。有没有解决方案,或者可能有不同的设计原则?

1 个答案:

答案 0 :(得分:3)

通常,在您执行任何可能导致邮件开始到达的操作之前,您需要整理机制以响应邮件。因此,如果您只是在发送某些消息时希望它们出现,请在配置好监听器之后再发送任何消息。

演员应该等到一切都到位后再开始正常的操作。

当然,并不总是可以100%确定这一点,因为你通常无法判断是否有其他任何东西正在收听你可能期待收听的消息总线,但如果这很重要则不是不合理的定义一些消息,各种参与者可以使用这些消息来验证其他参与者在事情开始之前是否已准备就绪。

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