如何在Erlang / OTP中构建MQ使用者循环?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Erlang / OTP中构建MQ使用者循环?相关的知识,希望对你有一定的参考价值。
我需要创建使用消息队列的简单应用程序,并使用Erlang / OTP异步处理消息。在Golang中考虑这个伪示例:
var queue chan
func main() {
for req := range queue {
go handleRequest(req) //handle asynchronously
}
}
如何根据OTP原则确定结构? 我一直在寻找gen_server,但在这种情况下,我在哪里定义我的循环resursive? 另外,我该如何启动异步句柄?我是否应该创建另一个主管并使用主管:start_child在每条新消息上?
标准库中的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
中实现。
以上是关于如何在Erlang / OTP中构建MQ使用者循环?的主要内容,如果未能解决你的问题,请参考以下文章
您如何设计基于Erlang / OTP的分布式容错多核系统的架构?
使用 Erlang/OTP 构建容错软实时 Web 应用程序
您如何设计基于 Erlang/OTP 的分布式容错多核系统的架构?