2

作为一个新手,使用 gen_server 编写一个玩具匹配(交易)引擎。

一旦发生交易/匹配,需要通知双方客户。

文档说:

reply(Client, Reply) -> Result

类型:

Client - see below
Reply = term()
Result = term()

当无法在 的返回值中定义回复时,gen_server 可以使用此函数显式向调用call/2,3或的客户端发送回复。multi_call/2,3,4Module:handle_call/3

Client 必须是提供给回调函数的 From 参数。Reply 是一个任意项,将作为call/2,3ormulti_call/2,3,4

返回值 Result 没有进一步定义,应始终被忽略。

鉴于上述情况,如何向其他客户端发送通知。

行动顺序示例

   C1 -> Place order  IBM,BUY,100,10.55
   Server -> Ack C1 for order
   C2 -> Place order  IBM,SELL,100,10.55
      Server -> Ack C2 for order
             -> Trade notification to C2
             -> Trade notification to C1 %% Can I use gen_server:reply() 
                                         %% If yes - How ?
4

1 回答 1

1

好吧,你不能。你ACK已经是回复了。gen_server:call 合同只接受单一答复。我的意思是,gen_server:call只会等待一个答复。

一般gen_server:reply可以像这样实现

reply({Pid, Ref}, Result) ->
    Pid ! {Ref, Result}.

这意味着如果您尝试发送多个回复,您只会在调用者进程的消息框中收到一些奇怪的消息。

提议

相反,我认为,您应该将每笔交易与一些参考相关联,并CX_Ref在 ACK 过程中使用该参考向调用者发送消息。然后,当您必须发送通知时,您只需向 C2 发送消息并发送给{C1_Ref, Payload}C2 。C1{C2_Ref, Payload}

此外,您可能想要引入一些监控来处理代理崩溃。

于 2016-06-17T17:58:50.127 回答