我必须说我对Misultin对 Web Sockets 的支持印象深刻(这里有一些例子)。我的 JavaScript 正在以“可忽略的”延迟或滞后发出请求并通过网络获取响应,太好了!
看看 WebSockets 的数据处理程序循环的样子,它类似于普通的 TCP/IP 套接字,至少是 Erlang 中的基本方式
% 回调收到的 websockets 数据 handle_websocket(Ws) -> 收到 {浏览器,数据} -> ws:send(["received '", Data, "'"]), handle_websocket(Ws); _忽略-> handle_websocket(Ws) 5000 之后 -> ws:send("推!"), handle_websocket(Ws) 结尾。
这段代码在由 Misultin 生成的进程中执行,这是您在启动服务器时为其提供的功能,如下所示:
开始(端口)-> HTTPHandler = fun(Req) -> handle_http(Req, Port) 结束, WebSocketHandler = fun(Ws) -> handle_websocket(Ws)结束, 选项 = [{port, Port},{loop, HTTPHandler},{ws_loop, WebSocketHandler}], misultin:start_link(选项)。. 有关此的更多代码,请查看示例页面。
我有几个问题。
问题 1:我可以像我们通常在 Erlang 中使用 TCP/IP 套接字一样更改 Web 套接字的控制进程吗?(我们通常使用
gen_tcp:controlling_process(Socket,NewProcessId)
:)问题 2: Misultin是唯一支持 WebSockets 的 Erlang/OTP HTTP 库吗?其余的在哪里?
编辑: 现在,我需要能够从 Misultin 传输 WebSocket 控件的原因
想一想
gen_server
将控制 WebSocket 池的一个,比如它是一个游戏服务器。在当前的 Misultin 示例中,对于每个 WebSocket 连接,都有一个控制进程,换句话说,对于每个 WebSocket,都会有一个衍生进程。现在,我知道 Erlang 是 Processes 的英雄,但是,我不希望这样,我希望这些初始进程在处理到我gen_server
的 WebSocket 控制权限后立即终止。我希望这
gen_server
可以在这些 WebSocket 之间切换数据。在当前的实现中,我需要Pid
像这样跟踪 Misultin 的 handle_websocket 进程:
%% 这里是misultin的控制流程 %% 我得到它的 Pid 并将它保存在某个地方 %% 并将其链接到 my_gen_server 以便 %% 如果它退出我知道它已经消失了 handle_websocket(Ws)-> process_flag(trap_exit,true), PID =自我(), 链接(my_gen_server), 保存连接(PID), 等待消息(WS)。 wait_msgs(Ws)-> 收到 {浏览器,数据}-> FromPid = self(), send_to_gen_server(数据,FromPid), handle_websocket(Ws); {广播,消息} -> %% 我可以广播到所有连接的 WebSockets ws:发送(消息), handle_websocket(Ws); _Ignore -> handle_websocket(Ws) 结尾。
上面,这个想法非常有效,我将所有控制过程保存到 Mnesia Ram 表中,如果应用程序想要向该特定用户发送消息,则根据给定标准查找它。但是,根据我想要实现的目标,我意识到在现实世界中,进程可能太多以至于我的服务器可能会崩溃。我希望至少有一个gen_server
来控制数千个 Web Socket,而不是为每个 Web Socket 拥有一个进程,这样,我可以节省一些内存。
建议: Misultin 的作者可以在他的下一个版本中为我们创建 Web Socket Groups 实现,从而我们可以让一组 WebSockets 由同一进程控制。这将类似于Nitrogen's Comet Groups
其中彗星连接在同一控制下组合在一起。如果这不可能,我们将需要自己进行控制,提供一个 API,我们可以在其中接管这些 Web 套接字的控制。
工程师们对此有何看法?
您对此有何建议和/或评论?
米苏尔廷的作者可以对此说些什么。谢谢大家