Cowboy 是用 erlang 编写的网络服务器。它为每个请求生成新进程,而不是使用该进程处理后续请求,如果 HTTP 流水线(一个接一个地在同一个套接字上发送多个请求,而不等待响应,并假设响应将以与发送请求相同的顺序发送回)由客户使用。
这很好,但是如果您想使用该网络服务器来构建实时网络应用程序,它有一个问题,那就是当套接字由于客户端网络问题而关闭时,代表服务器上该套接字的进程将终止。这意味着您不能使用该进程来存储一些会话数据(因为在实时 Web 应用程序中,您可能希望在 http 请求结束后进行(例如,如果使用长轮询)并且有一些与连接的客户端相关联的状态即使http请求已结束,也可以将他视为“他在线”。
在 sock.js 中,它通过为每个客户端(每个会话 id)生成一个多进程来解决。
因此,如果您有 2000 个使用 websockets 的客户端,您将有大约 4k 个进程(一个来自牛仔的进程代表该套接字,另一个用于保持会话状态以防牛仔进程将被终止(例如由于网络问题)。
问题是:我在 erlang 中相对较新,所以我不知道它在性能改进问题上是否有意义,但我正在考虑稍微重写 Cowboy 网络服务器,以便表示实时连接的过程不会结束,直到我想要它(即使底层的 websocket 套接字将被终止,该进程也将处于活动状态)。
这将消除为每个客户端增加一个会话进程的需要。因此,您将只有 2000 个进程,而不是 4000 个进程。它可以成为 erlang 中巨大的性能提升器吗?