Erlang Gen Server之间的通信

3
我正在使用Erlang OTP框架构建网络路由器应用程序。
在运行过程中,Supervisor创建了两个genserver,每个estagen_server:call(CurrentProcName,{BinEvent,UniqueTrxId,MdPid},infinity)都会建立一个tcp连接到两个单独的服务器。
现在,在运行应用程序时,有时一个genserver会收到重复事件,在这种情况下,我希望该事件由第二个gen_server处理。
为此,我调用了gen_server:call(NextProcName,{BinEvent,UniqueTrxId,MdPid},infinity)。
当满足重复事件的条件时,我在gen_server模块内部调用此函数。
NextProcName :: 它是第二个genserver的注册名称
注意:代码对于两个genserver保持不变
问题是,我能够复制事件,但某种方式事件未传递到第二个genserver :(
请建议我是否做错了。
1个回答

3
如果您可以分享源代码,将不胜感激。
你确定消息真的已经被接收到了,还是只是没有收到回复?
我在这里看到最可能的问题是您正在同步转发消息。如果不是这种情况,那么您可以完全忽略我的帖子。现在,让我们看看同步转发如何运作:
 client          server1             server2
   |                |                   |
   >--- Msg1 ----> (ok)                 |
(waits S1)          |                   | 
  (ok) <-- Reply ---<                   |
   >--- Msg2 ----> (ok)                 |
(waits S1)          >----- Msg2 -----> (ok)
(waits S1)      (waits S2) <--- Reply --<      
(waits S1)      (Waits S2)              |

          *Stuff crashes*

这并不是非常清晰,但它展示了正在发生的事情。在这里,Server1 基本上仍然被视为正在处理消息 Msg2 到 gen_server 行为,并且因此永远不会读取它正在等待的来自 Server2 的回复。这通常会导致超时和崩溃。
正确的方法是从 Server1Server2 发送异步调用(一个 cast),包括 From 变量,以便 Server2 可以通过 gen_server:reply/2 回复并替换 Server1。然后,Server1 应该返回一个 noreply 元组。这将释放 Server1 的进程,并使其能够继续处理其他内容。

你肯定不会给出糟糕的建议 :P。 - Arunmu
非常抱歉,我暂时无法分享代码。但我会尽我最大努力在这个帖子中用答案来解释条件,而不是评论。 - Arunmu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接