在选择采用 Websocket 作为我公司 Web 应用程序背后的实时技术时,我试图确定服务器的工作负载是多少。
据我了解,Apache 内部机制认为,在整个 Websocket 会话期间,Apache 进程或线程将保持活动状态,并使用 mod_proxy_wstunnel 代理连接;该进程是否还会处理传统的客户端 http 请求?还是说,当这些请求到达时,另一个进程会“浪费”时间处理这些请求?
答案1
这完全取决于您的 Web 应用程序的设计方式。您确实可以通过已建立的 WebSocket 传递“传统 http 请求”……或者您可以用更传统的方法处理请求。不幸的是(从系统工程师的角度来看)开发人员很懒……并且很少付出必要的努力通过已建立的 WebSocket 传递大量流量。它通常用于宣布页面上各个位的“更新”……以及提取图像数据和其他留给更典型的 GET 和 POST 的工作。
简而言之...是的...您将在每个 websocket 的生命周期内绑定 1 个进程...并为每个请求绑定 1 个连接。但是,您可以利用连接保持活动来反复循环使用相同的连接...但这可能会影响整体页面加载时间,因为您必须等待每个项目按顺序发送而不是并行发送。
这就是 Apache 的真正关键之处。您可以更改多处理模块 (MPM),以更改处理这些保持活动连接的方式……以及许多其他调整整体性能的方法。
尽管您可以对 Apache 进行各种微调……但有时它并不是完成任务的完美工具。Apache 是工具箱中的瑞士军刀。它旨在成为工具箱中最动态的工具。Nginx 更加精简,不包含 apache-knife 中的镊子或剪刀选项……而 nodejs 只是一把黄油刀。有时(当环境允许时)最好混合搭配以获得所有优点。