Java中的套接字最佳实践

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

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

最佳答案
为了使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.

转载注明原文:Java中的套接字最佳实践 - 代码日志