9

我一直致力于构建一个公共 API,该 API 将具有大量并发访问,并且我认为其中一个方面是使用异步 I/O 来考虑可伸缩性方面。

最初我认为将 Nginx 用作 HTTP 服务器(事件驱动),因为他以异步方式工作,与 Tomcat 不同。API 将用 Java 构建,为此我认为使用以下组件:

  • Tomcat 7 - HTTP/Web 服务器 + Java 容器
  • Netty.io 还是 HttpCore?
  • Resteasy(REST 层,带 HttpServlet30Dispatcher servlet)
  • MongoDB(带异步 Java 驱动程序)

我看过很多关于 Servlet 3.0 的讨论,因为新版本支持异步请求(使用 NIO)。基于我的问题和上面的模型,我有一些问题:

  1. 一旦我计划使用支持异步请求的 Servlet 3.0,是否有必要使用 Netty.io?
  2. 使用事件驱动的网络服务器(例如:Jetty)与使用不是事件驱动的网络服务器的基于进程的网络服务器(如 Tomcat 7(支持 Servlet 3.0))不同?
  3. 我在许多站点中看到 Netty.io 以一种线程可以接受许多请求的方式工作,而不是单线程对等请求的经典方式。在实践中,它是如何工作的?
  4. 异步请求处理(Servlet 3.0)和非阻塞 IO(NIO)是不同的概念吗?以何种方式?
  5. 我从未见过使用 NIO 的 REST API,这是一个好方法吗?我会遇到哪些潜在问题?
4

2 回答 2

3

Is necessary to use Netty.io once that I have plans to use Servlet 3.0 that supports Asynchronous Requests too?

No. It should all be handled by the container.

Use an event-driven webserver (ex: Jetty) is different to use a process based webserver like Tomcat 7 (that supports to Servlet 3.0) that isn't an event-driven webserver?

I'm not aware of any such difference. They both implement Servlet 3.0 so to that extent they are both event-driven.

I saw in many sites that Netty.io works in a way where a thread can accept many requests, instead of the classic way of one thread peer request. In the practice, how it works?

It's irrelevant, see (1) above.

Asynchronous request handing (Servlet 3.0) and Non-Blocking IO (NIO) are different concepts? In which way?

Yes. In every way. Too large a question to address here.

I never see a REST API using NIO, is it a good approach? Which potential problems can I will have?

I've rarely seen any need to use NIO at the client end.

于 2013-01-29T08:00:48.273 回答
2

我想说比较 Servlet API 和 NIO 是无关紧要的。您可以使用例如 Netty 来实现 Servlet API(这非常接近于自行车发明)。考虑到 3.0 中包含的异步特性,我看不出有可能基于阻塞 IO 构建有效的实现。我们甚至不需要调查来源。像“org.mortbay.jetty.nio.SelectChannelConnector”这样的类名是非常自描述的。

REST 也是如此。那是另一层。例如,您可以设置 tomcat 以使用 NIO 连接器。基本上这样的配置更改在应用层是不可见的。(我不考虑有时会发生的错误)。

于 2013-01-29T21:59:28.183 回答