2011-10-10 38 views
-4

需要从接收来自其他进程的许多传入消息的进程实现同步呼叫。区分的问题 - 当呼叫回复到呼叫时。我是否需要产生额外的进程来从队列中提取消息到缓冲区,而不会遇到返回消息,然后将其发送到主进程,并在其他人接受之后。来自进程的同步呼叫与许多传入消息

+1

我不知道我理解你的问题。 –

+1

假设我已经正确地理解了你的问题 - 但我怀疑它 - 你有几个进程向单个服务器发送随机消息,这需要收集(也许处理)消息,直到它收到一条特殊消息,在这种情况下,它会回复主叫方。你是这个意思吗? –

+0

我的进程是客户端和分布式db节点之间的中介。最终clent可以要求节点之间的复制。在复制期间,不能处理任何对db的请求,它们必须在复制完成后进行缓冲和处理。复制完成触发器发送消息给介体,但在介体队列中有很多消息。调解员如何知道他收到有关复制的特殊消息? – Yola

回答

0

诀窍是使用引用作为令牌用于复制:

replicate() -> 
    {ok, Token} = db:ask_replicate(...), 
    receive 
     {replication_completed, Token} -> 
      ok 
    end 

其中Token与对make_ref()一个呼叫建立。由于没有其他信息会匹配Token,您是安全的。其他邮件将被放置在邮箱中供以后审查。

但是,上述解决方案并未将进程崩溃考虑在内。您还需要在数据库服务器上安装监视器。让模式正确的最简单方法是让介体为gen_server。或者,您可以阅读LearnYouSomeErlang中的章节:http://learnyousomeerlang.com/what-is-otp#the-basic-server查看kitty_server中的同步呼叫。

+0

男人,现在我在Cesarini和汤普森的第11章,下一个是“OTP行为”,然后我肯定读了提供的链接。谢谢。))) – Yola

+0

现在我实现了额外的线程,哪个工作是过滤器消息,与它我解决了mwssage队列的一致性和从队列的中间弹出所需的消息。你知道,在调用ask_replicate和replication_completed到达之间,我可以从另一个进程获得吨的消息。 – Yola