HTTP 1.1 服务器发送大文件
HTTP 1.1 server sending large files
我读过一篇关于使用自定义 HTTP 1.1 服务器为大量客户端提供服务的文章。它说需要使用一个线程池,该线程池的线程数与 CPU 内核一样多,而不是为每个请求生成一个新线程。但是,假设一个文件有 1 GB 长。它的传输将停止线程池中的队列之一,同时传输文件,停止处理新请求。传输此类文件时肯定会产生一个线程吗?但是应用什么标准来确定是否要生成新线程来服务请求,文件大小?还是其他什么?也许使用了某种形式的协作多任务处理?
每个核心一个队列是一个糟糕的设计。通常,每个池线程都有一个队列和一个全局队列。线程首先检查自己的队列,然后是全局队列,然后是其他线程的队列。没有工作会卡住。
您可以在同一个 HTTP 服务器中混合使用阻塞和非阻塞 IO。大多数请求都很快完成,因此使用非阻塞 IO 没有多大意义。
让长运行宁请求使用非阻塞 IO 是个好主意,以免占用太多线程。 1GB 的文件传输听起来确实是个不错的例子。
HTTP 服务器中的套接字 IO 通常应该是非阻塞的。在许多连接的客户端和长期连接的假设下,HTTP 服务器通常 运行。做这个规模几乎需要非阻塞IO。但请注意,尽管网络端应该是非阻塞的,但在架构上也不需要使请求处理成为非阻塞的。
套接字服务器有许多过时的设计(包括实现和教程)。使用现代 API 和现代设计,实现可扩展性和良好的代码质量确实并不难。
我读过一篇关于使用自定义 HTTP 1.1 服务器为大量客户端提供服务的文章。它说需要使用一个线程池,该线程池的线程数与 CPU 内核一样多,而不是为每个请求生成一个新线程。但是,假设一个文件有 1 GB 长。它的传输将停止线程池中的队列之一,同时传输文件,停止处理新请求。传输此类文件时肯定会产生一个线程吗?但是应用什么标准来确定是否要生成新线程来服务请求,文件大小?还是其他什么?也许使用了某种形式的协作多任务处理?
每个核心一个队列是一个糟糕的设计。通常,每个池线程都有一个队列和一个全局队列。线程首先检查自己的队列,然后是全局队列,然后是其他线程的队列。没有工作会卡住。
您可以在同一个 HTTP 服务器中混合使用阻塞和非阻塞 IO。大多数请求都很快完成,因此使用非阻塞 IO 没有多大意义。
让长运行宁请求使用非阻塞 IO 是个好主意,以免占用太多线程。 1GB 的文件传输听起来确实是个不错的例子。
HTTP 服务器中的套接字 IO 通常应该是非阻塞的。在许多连接的客户端和长期连接的假设下,HTTP 服务器通常 运行。做这个规模几乎需要非阻塞IO。但请注意,尽管网络端应该是非阻塞的,但在架构上也不需要使请求处理成为非阻塞的。
套接字服务器有许多过时的设计(包括实现和教程)。使用现代 API 和现代设计,实现可扩展性和良好的代码质量确实并不难。