【问题标题】:Event Driven server using Java NIO使用 Java NIO 的事件驱动服务器
【发布时间】:2015-04-11 23:24:34
【问题描述】:

我正在尝试使用 java NIO 构建一个异步(非阻塞)HTTP 服务器。我目前有一个线程池实现,并希望将其变成单线程的事件驱动。

事件驱动服务器究竟是如何工作的? 我们还需要线程吗?

我一直在阅读 Java 通道、缓冲区和选择器。 因此,在我创建了 serverSocketChannel 和选择器并侦听请求后,我是否需要将请求移交给其他线程,以便他们可以处理它们并为请求提供服务。如果是这样,它与线程池实现有何不同。

如果我不创建更多可以处理请求的线程,那么同一个线程如何仍然继续侦听请求并处理它们。我说的是 SCALABLE,比如说总共有 100 万个请求,同时有 1000 个请求。

【问题讨论】:

  • 你见过Netty吗?如果不是,我不能高度推荐该库以用于异步网络。您仍然需要将异步 I/O 作为一个概念来思考,但在我看来,Netty 可以帮助您更清楚地推理您的设计。
  • 谢谢,我会试试的。但是现在,我必须在不使用任何库的情况下做到这一点。所以我只是在寻找开始的概念。

标签: java multithreading nio httpserver event-driven


【解决方案1】:

我一直在阅读 Java 通道、缓冲区和选择器。所以在我创建了 serverSocketChannel 和 selector 并监听请求之后,我是否需要将请求交给其他线程,以便他们可以处理它们并提供请求。

不,这个想法是您处理可用的数据,不一定使用线程。

复杂性来自于处理数据的需要当它来了。例如,您可能不会立即收到完整的请求。在这种情况下,您需要将其缓冲到某个地方,直到您收到完整的请求,或者逐步处理它。

收到请求后,您需要发送响应。同样,整个响应通常不能一次发送。您在不阻塞的情况下尽可能多地发送,然后使用选择器等待直到您可以发送更多(或发生另一个事件,例如另一个请求进来)。

【讨论】:

  • 这是否意味着如果服务器被请求轰炸,比如 1000 个并发请求,然后更多,直到一百万,它就无法写入任何内容?这是否也意味着缓冲区大小应该足以容纳 1000 个请求?
  • 通常请求会在操作系统级别缓冲。我不确定缓冲 1000 个请求是什么意思;您通常会为每个请求关联一个单独的缓冲区(除非您可以逐个处理请求)。您可以选择要处理的选定频道,因此即使您有大量传入请求,也没有理由无法写入期待响应的频道。
  • 哦,有道理。那么,我可以为收到的每个请求创建一个新的通道缓冲区对吗?
  • @AayushGupta 最好将一对缓冲区与连接相关联。您可以为自己定义一个包含它们的上下文类,并将其用作选择键附件,因此它会粘在频道上。
猜你喜欢
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多