【问题标题】:Cowboy websocket Global processing牛仔 websocket 全局处理
【发布时间】:2013-05-30 07:43:08
【问题描述】:

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

因为每个牛仔都有自己的进程 如何运行一个进程,每个用户都可以发送消息,并且可以在该进程中完成处理。

【问题讨论】:

    标签: erlang websocket cowboy


    【解决方案1】:

    澄清一下,每个 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 的 websocket_init/3 函数中启动 my_processor,将 my_processorprocess 的 Pid 存储在从 websocket_init 返回的 State 参数中,并使用该 pid 而不是 @987654329 @ 全局名称。

    【讨论】:

    • 谢谢johlo ..这就是我开始做的事情。实际上,由于要求有点复杂,我正在我的主应用程序中创建一个单独的应用程序。所以我在其中创建了一个 myapp 文件夹,其中保存了应用程序文件和模块文件。我可以使用 rebar 编译它们但是当我启动服务器时出现以下错误:- {"init terminating in do_boot",{{badmatch,{error,{"no such file or directory","rabbit.app"}}}, [{websocket,start,0,[{file,"src/websocket.erl"},{line,14}]},{init,start_it,1,[]},{init,start_em,1,[]} ]}} 在 rebar.config 我设置了 {sub_dirs, ["apps/rabbit"]}。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2017-06-22
    • 2013-12-19
    • 2018-08-28
    • 2021-05-09
    • 1970-01-01
    • 2017-11-29
    相关资源
    最近更新 更多