Erlang Cowboy web服务器-提高性能

Erlang Cowboy web服务器-提高性能,erlang,cowboy,Erlang,Cowboy,Cowboy是用erlang编写的Web服务器。如果客户端使用HTTP管道(在同一套接字上一个接一个地发送多个请求,而不等待响应,并假设响应将以与发送请求相同的顺序发送回来),则它会为每个请求生成新的进程,然后将该进程用于后续请求 这很好,但如果您想使用该web服务器构建实时web应用程序,它有一个问题,即当套接字关闭时(例如,由于客户端网络问题),服务器上表示该套接字的进程将终止。这意味着您不能使用该进程存储某些会话数据(因为在实时web应用程序中,您可能希望在http请求结束后(例如,如果使

Cowboy是用erlang编写的Web服务器。如果客户端使用HTTP管道(在同一套接字上一个接一个地发送多个请求,而不等待响应,并假设响应将以与发送请求相同的顺序发送回来),则它会为每个请求生成新的进程,然后将该进程用于后续请求

这很好,但如果您想使用该web服务器构建实时web应用程序,它有一个问题,即当套接字关闭时(例如,由于客户端网络问题),服务器上表示该套接字的进程将终止。这意味着您不能使用该进程存储某些会话数据(因为在实时web应用程序中,您可能希望在http请求结束后(例如,如果使用长轮询),并将某些状态与连接的客户端关联,并认为即使http请求结束,他仍然是“在线的”

在sock.js中,可以通过为每个客户机(每个会话id)多生成一个进程来解决这个问题

因此,如果您有2000个使用WebSocket的客户端,您将有大约4k个进程(一个来自cowboy的进程表示该套接字,另一个用于保持会话状态,以防cowboy进程终止(例如,由于网络问题)

问题是:我在erlang相对较新,所以我不知道这在性能改进方面是否有意义,但我正在考虑重新编写Cowboy Web服务器,这样表示实时连接的过程在我需要时才会结束(即使基础websocket套接字将被终止,该进程也将处于活动状态)


这将消除每个客户端需要多一个会话进程的需求。因此,您将只需要2000个进程,而不是4000个进程。这在erlang中是否可以成为巨大的性能提升器?

erlang对进程非常好,但是,太多的事情都不好。使用进程作为会话的直接映射不是一个好主意。为什么不记录呢逻辑上?我假设你可以有一些内存存储,比如说,
ETS
,甚至
mnesia

如果我使用
websockets
进行通信,每个用户都通过一个这样的进程连接,但是,您只需将某个随机唯一的
会话密钥映射到每个进程,从而映射到每个用户

-record(client,{web_sock_pid, session_key,username}). -记录(客户端,{web\u sock\u pid,会话密钥,用户名})。 如果进程退出,并且客户端有重新连接的方法,一旦它将自己重新标识为同一个用户,那么会话密钥仍然有效,但是连接的进程的pid已更改。这无关紧要


如果不是web套接字,而是HTTP REST/JSON/JSONP/XML服务
,那么就非常简单了。在RAM中使用ETS表。存储一个新会话,并将定义该会话的参数存储在RAM中,然后对于每个请求,会话密钥可以加上其他参数。消息传递通过comet或频繁检查进行s在客户端。

如果你问我的话,听起来你在做一些过早的优化

Erlang进程非常便宜。您不必担心生成太多manny进程


每个websocket使用两个进程编写它,然后进行一些测量,看看它在哪里使用了最多的内存和浪费了最多的cpu周期。

记住,Erlang进程与操作系统进程完全不同。Erlang进程并不昂贵,最好被认为是结构化计算的工具。牛仔重写可能没有帮助性能。如果你的唯一目标是减少进程数量,这甚至可能会造成伤害。你为什么用Elixir来标记这个问题?@OnorioCatenacci:好吧,它们都在erlang vm上运行,这个问题甚至对Elixir都有效,但如果你想的话……你误解了我。我问你为什么用Elixir来标记这个问题,因为我觉得有问题也许你可以尝试在ETS中存储会话数据,看看这是否足以满足你的需要。我觉得这是一种常见的方法。