非事件驱动的HTTP服务器环境中的服务器端Websocket实现

Ya.*_*man 5 perl websocket psgi

我试图理解服务器端Websocket端点的实现/选项 - 特别是在使用PSGI/Plack的Perl中我有一个问题:为什么所有服务器端websocket实现都基于事件驱动的PSGI服务器(Twiggy,Tatsumaki等). )?

我认为websocket通信是异步的,但非事件驱动的PSGI服务器(比如Starman)可以产生一个异步监听器来处理websocket方面的事情.我已经看过(但不了解)Websocket服务器的PHP实现,为什么不用PSGI就可以完成同样的操作而不必将服务器更改为事件驱动的服务器?

mok*_*oka 1

处理套接字的底层网络逻辑取决于平台、操作系统和特定的软件实现。
最常见的三种方法是:

  • 拉动- 有阻塞不断“询问”套接字是否有一些数据。这种方法很糟糕,因为只要等待一些数据,它就会阻塞主线程的执行。
  • 每个套接字线程- 每个新连接都涉及创建新线程,并以阻塞方式询问每个套接字在该线程内发生。所以它不会用逻辑阻塞主线程。这种方法很糟糕,因为为每个连接创建线程对于内存来说太昂贵,并且根据操作系统和其他标准可能约为 1Mb 或 RAM。
  • 异步- 当有事情发生时,使用系统功能“通知”您的进程。因此,一旦您的应用程序准备就绪(如果是单线程应用程序),您就可以做出反应,甚至可以立即在单独的线程中做出反应。此方法非常高效,因为它可以节省 RAM,并且允许您的应用程序无需等待或请求数据即可运行。它利用大多数操作系统和平台提供的现有功能。

考虑到这一点,您确实可以创建单进程功能方式来处理套接字流量。但正如之前所证明的那样,这根本没有效率。这就是为什么完全异步模型在今天很重要,因为大多数语言和平台都支持这种范例。