Netty 相对于基本 ServerSocket 服务器的优势?

我需要创建一个相对简单的Java tcp / ip服务器,并且我在确定是否应该使用Netty之类的东西或者只是坚持使用简单的ServerSocket和InputStream / OutputStream时遇到了一点麻烦。

我们实际上只需要侦听一个请求,然后将新客户端 Socket 传递给新线程中的一些处理代码。处理完成并发送响应后,该线程将终止。

我喜欢Netty中的管道,解码器等的想法,但对于这样一个简单的场景,它似乎不值得增加前期开发时间。对于我们最初的要求来说,这似乎有点过分了,但我有点紧张,因为有很多事情我没有考虑。Netty对这种简单的要求有什么好处(如果有的话)?我没有考虑什么?


答案 1

Netty与使用流简单地读取和写入套接字相比,Netty的主要优点是Netty支持非阻塞的异步I / O(使用Java的NIO API);当您使用流从套接字读取和写入(并且从 a 接受的每个连接启动一个新线程)时,您正在使用阻塞、同步 I/O。ServerSocket

Netty方法的扩展性要好得多,如果您的系统需要能够同时处理许多(数千个)连接,这一点很重要。如果您的系统不需要扩展到多个同时连接,那么使用像Netty这样的框架可能不值得麻烦。

更多背景信息:线程是操作系统中相对昂贵的资源。每个线程都需要堆栈的内存(例如,大小可以为 2 MB)。当您创建数千个线程时,这将花费大量内存;此外,操作系统对可以创建的线程数有限制。因此,您不希望为每个接受的连接启动新线程。异步 I/O 的思想是将线程与连接分离(没有一对一关系)。连接数可能比线程多得多,每当其中一个连接上发生某些事件(例如,收到数据)时,线程池中的线程将临时用于处理该事件。


答案 2

我认为使用netty的好处不是立竿见影的,而是在需求变化和维护变得更加复杂时,实际上会更晚才出现。Netty带来了对HTTP协议的内在理解,因此您可以提供简单的RESTful Web服务。此外,您还可以选择利用 netty 作为框架提供的异步请求处理,以便您可以获得更好的性能并为几个数量级的并发请求提供服务。


推荐