如何在Erlang / OTP中构造MQ使用者循环?

时间:2019-04-24 16:53:42

标签: erlang otp

我需要创建一个简单的应用程序,该应用程序使用消息队列并使用Erlang / OTP异步处理消息。考虑一下Golang中的这个伪示例:

var queue chan
func main() {
    for req := range queue {
        go handleRequest(req)  //handle asynchronously 
    }
}

如何按照OTP原则正确构造此文件?
我一直在寻找 gen_server ,但是在这种情况下,我应该在哪里定义循环递归?
另外,如何启动异步处理?我应该创建另一个主管并在每封新邮件上使用 supervisor:start_child 吗?

1 个答案:

答案 0 :(得分:1)

标准库中的gen_server模块为您定义了递归循环。您唯一需要做的就是实现回调函数来处理消息。如果消息队列正在向您的gen_server进程发送Erlang消息,则您将执行以下操作:

handle_info({incoming_request, Request}, _From, State) ->
    async_handle_request(Request),
    {noreply, State}.

要异步处理请求,async_handle_request将为每个传入请求启动一个进程。有两种方法:要么生成一个进程,要么在simple_one_for_one主管下启动每个进程。差异归结为错误处理和关闭行为。如果处理请求失败,该怎么办?您是否忽略该错误,还是将其传播到gen_server进程,还是让主管重新启动该进程并重试该请求?

This question解释了何时可以使用simple_one_for_one主管。如果您只想生成一个进程,则如下所示:

async_handle_request(Request) ->
    spawn_link(fun() -> handle_request(Request) end).

然后在handle_request中实现实际的请求处理逻辑。