Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有消息处理的F#循环依赖_F#_Message Queue_Actor - Fatal编程技术网

具有消息处理的F#循环依赖

具有消息处理的F#循环依赖,f#,message-queue,actor,F#,Message Queue,Actor,我正在尝试使用actor模型构建系统,该模型具有跨消息传递的复杂逻辑,所以有一个actor从一开始就发送消息并侦听传入的响应。此外,还可以使用UDP数据报等来完成消息传递 所以,给定的actor依赖于消息sender,这意味着系统必须首先创建消息sender。为了将传入消息传递给actor,消息侦听器必须依赖于actor(它的作用类似于actor.Post incomingMessage) 问题是关于初始化顺序:似乎我应该首先创建发送方,然后创建参与者,最后创建侦听器,但如果系统将以这种方式构建

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

所以,给定的
actor
依赖于消息
sender
,这意味着系统必须首先创建消息
sender
。为了将传入消息传递给actor,消息
侦听器
必须依赖于actor(它的作用类似于
actor.Post incomingMessage


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

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

参与者应该等到一切就绪后才开始正常操作

当然,这并不总是100%确定的,因为你通常无法判断在消息总线上是否还有其他东西在听,而你可能希望听到的是,但如果这很重要的话,那么定义一些不同参与者可以用来验证其他参与者在事情开始之前准备好了的消息并不是不合理的

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

因此,有两种方法:1)在参与者启动之前初始化侦听器,在actor开始时将所有累积的消息刷新到actor,并从此时起立即将所有传入消息传递给actor 2)将启动/停止状态添加到actor的状态机,并且仅在设置侦听器时启动