5

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

我知道 websocket 通信是异步的,但是一个非事件驱动的 PSGI 服务器(比如 Starman)可以产生一个异步侦听器来处理 websocket 方面的事情。我已经看到(但不理解)Websocket 服务器的 PHP 实现,那么为什么不能在不将服务器更改为事件驱动的情况下对 PSGI 进行同样的操作呢?

4

1 回答 1

1

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

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

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

于 2014-03-06T11:24:52.560 回答