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



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

我知道websocket通信是异步的,但是一个非事件驱动的PSGI服务器(比如Starman)可以产生一个异步侦听器来处理websocket方面的事情。我已经看到(但不理解)Websocket服务器的PHP实现,那么为什么不能做相同的PSGI,而不必改变服务器为事件驱动的一个?

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

  • -有阻塞常数"询问"如果套接字有一些数据。这个方法很糟糕,因为它会阻塞主线程的执行,只要它等待一些数据。
  • 线程每个套接字 -每个新连接涉及创建新线程,并以阻塞方式请求每个套接字在该线程中发生。所以它不会用逻辑阻塞主线程。这种方法很糟糕,因为为每个连接创建线程对内存来说太昂贵了,根据操作系统和其他标准,可能会占用大约1Mb或RAM。
  • async -使用系统功能来"通知"你的进程。所以你可以在你的应用程序准备好后做出反应(在单线程应用程序的情况下),甚至可以直接在单独的线程中做出反应。这种方法非常有效,因为它节省了内存,并允许应用程序无需等待或请求数据即可工作。它利用大多数操作系统和平台提供的现有功能。
考虑到这一点,您确实可以创建单进程功能方式来处理套接字流量。但正如之前所证明的那样,这根本没有效率。这就是为什么完全异步模型是当今主流的原因,因为大多数语言和平台都支持这种范式。

相关内容

  • 没有找到相关文章