牛仔websocket全球加工

时间:2013-06-04 02:27:31

标签: erlang websocket cowboy

我有一个牛仔websocket服务器。许多客户端通过websocket发送消息。我需要对消息进行处理。我可以在websocket_handle中这样做,但是因为它是实时的我想避免它而不是我想将消息发送到全局进程,其中所有处理都可以完成。

每个牛仔拥有它自己的流程如何运行一个流程,每个用户都可以在该流程中发送消息和处理。

1 个答案:

答案 0 :(得分:3)

为了澄清,每个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连接创建一个单独的进程,你可以在Cowboy的my_processor函数中启动websocket_init/3,将my_processor进程的Pid存储在websocket_init返回的State参数中并使用它pid而不是processor全局名称。