我有一个牛仔 websocket 服务器。许多客户端通过 websocket 发送消息。我需要对消息进行处理。我可以在 websocket_handle 中做到这一点,但是因为它是实时的,所以我想避免它,而是我想将消息发送到可以完成所有处理的全局进程。
因为每个牛仔都有自己的进程如何运行一个进程,每个用户都可以发送消息,并且可以在该进程中完成处理。
澄清一下,每个 websocket 连接在 Cowboy 中都会有自己的 erlang 进程,因此来自不同 websocket 客户端的消息将在不同的进程中处理。
如果您需要从 websocket 移动处理,您可以简单地在您的应用程序启动时(例如,当您启动 Cowboy 时)启动一个新的处理程序/服务器进程,以侦听进程命令和数据。示例处理代码:
-module(my_processor).
-export([start/0]).
start() ->
spawn(fun process_loop/0).
process_loop() ->
receive
{process_cmd, Data} ->
process(Data)
end,
process_loop().
启动它时,还要使用全局名称注册进程。这样我们以后可以从 websocket 处理程序中引用它。
Pid=my_processor:start().
register(processor, Pid).
现在您可以将数据从 Cowboy 的websocket_handle/3
函数发送到处理过程:
websocket_handle(Data, Req, State) ->
...,
processor ! {process_cmd, Data},
...,
{ok,Req,State}.
请注意,该my_processor
进程将处理来自所有连接的处理请求。如果你想为每个 websocket 连接有一个单独的进程,你可以my_processor
在 Cowboy 的websocket_init/3
函数中启动,将my_processor
进程的 Pid 存储在从 websocket_init 返回的 State 参数中,并使用该 pid 而不是processor
全局名称。