在我的应用程序中,有一个基本上类似于日志的文件,即 不断补充。我想使用 Range 标头作为长轮询和 websockets 的替代方法来读取补充文件,因为这些技术的实现需要时间,尤其是考虑到使用 C++。NGINX 处理这项任务的效率如何,在处理补充文件时会出现问题吗?哪些参数最适合实施这种方法?也许您需要在应用程序中使用directio 和NGINX 进行优化?还是值得完全放弃这个想法?... 基于 Linux 的服务器,ext4 文件系统。文件大小不超过100MB(同时录制到一个文件,然后创建一个新文件)。
PS:无论如何你都必须写入文件,拆分成小文件与这种方法的实现无关。
重新发明轮子是没有意义的,因为 nginx 已经有一个 websocket 模块来处理所有的艰苦工作。您所要做的就是将消息传递给 nginx。一次安装:
设置也不难。可以在多服务器配置中运行 Redis。
如果由于某种原因您不能使用此模块,那么再次创建另一个数据库是值得的。在严重的工作负载上,磁盘上的文件永远不会取代真正的数据库,无论是 MySQL 还是其他什么。如果只是因为一个典型的数据库可以保证热数据将在 RAM 中,而磁盘缓存根本不能保证任何事情。这很容易通过一个简单的基准来检查。
在替代方案中,您可以考虑例如websocketd。这个程序本质上与inetd非常接近,与nginx分开存在。您只需要将WS 连接重定向到它,这非常简单。
在最简单的形式中,没有 nginx,从文件中读取新行并通过 WebSocket 传输它们的程序将如下所示: (
tail.sh
)读取数据的页面如下所示: (
index.html
)如果两个文件在同一个目录中,则运行:
在浏览器中打开http://127.0.0.1:8000/并写入相邻控制台中的文件:
我们打印文本并同时查看它在浏览器窗口中的显示方式。
这将允许读取程序访问各种变量,就好像它正在运行 CGI 环境一样,例如
QUERY_STRING
其他。无需检查它们,您甚至可以通过从 bash 中删除该层来做到这一点:为了不使读取文件的程序复杂化,您可以使用auth_request 指令在 nginx 端检查对 WebSocket 连接的访问。