Java中的套接字最佳实践

时间:2015-05-29 07:17:50

标签: java multithreading sockets server

用Java编写任何类型的Web服务器(无论是Web服务器,RESTful webapp还是微服务),您都可以使用套接字在客户端和服务器之间进行双通道通信。 使用公共SocketServerSocket类是微不足道的,但由于套接字是阻塞的,因此最终会为每个请求创建一个线程。使用此线程系统,您的服务器将完美地工作,但不会很好地扩展。 另一种方法是通过SocketChannelServerSocketChannelSelector使用Streams,显然不像普通套接字那样简单。

我的问题是:这两个系统中的哪一个用于生产就绪代码?我在谈论像Tomcat,Jetty,Sparkjava等大中型项目? 我想他们都使用Stream方法,对吗?

1 个答案:

答案 0 :(得分:3)

为了使Web服务器真正具有可伸缩性,您必须使用non-blocking I/O来实现它 - 这意味着您应该以这样的方式实现它,即线程永远不会被阻塞,等待I / O操作完成

线程是相对昂贵的对象。例如,对于每个线程,需要为其调用堆栈分配内存。默认情况下,这是一个或几MB的顺序。这意味着如果你创建了1000个线程,那么所有这些线程的调用堆栈就已经花费了大约1 GB的内存。

在天真的服务器应用程序中,您可以为每个接受的连接(每个客户端)创建一个线程。如果您有许多并发用户,这将无法很好地扩展。

我不知道像Tomcat和Jetty这样的服务器的实现细节,但它们很可能是使用非阻塞I / O实现的。

有关Tomcat中非阻塞I / O的一些信息:Understanding the Tomcat NIO Connector

Java中最着名的非阻塞I / O库之一是Netty