我正试图用java NIO构建一个异步(非阻塞)HTTP服务器。我目前有一个线程池实现,并希望将其变成单线程的事件驱动。
事件驱动服务器究竟是如何工作的?我们还需要线程吗?
我一直在阅读Java通道、缓冲区和选择器。因此,在我创建了一个serverSocketChannel和选择器并侦听请求之后,我是否需要将请求移交给其他线程,以便他们能够处理它们并为请求提供服务。如果是这样的话,它与线程池实现有何不同。
如果我不创建更多可以处理请求的线程,那么同一个线程怎么能继续侦听和处理请求呢。我说的是SCALABLE,比如说总共有100万个请求,同时有1000个请求。
我一直在阅读Java通道、缓冲区和选择器。因此,在我创建了一个serverSocketChannel和选择器并侦听请求之后,我是否需要将请求移交给其他线程,以便他们能够处理它们并为请求提供服务。
不,我们的想法是在数据可用时处理数据,而不一定使用线程。
复杂性来自于在数据出现时处理数据的需要。例如,您可能无法一次收到完整的请求。在这种情况下,您需要将它缓冲在某个地方,直到您得到完整的请求,或者逐段处理它。
收到请求后,您需要发送响应。同样,通常不能同时发送整个响应。您可以在不阻塞的情况下尽可能多地发送,然后使用选择器等待,直到您可以发送更多(或者发生另一个事件,例如另一个请求传入)。