题目1:高并发场景下的Socket优化设计
场景描述
某工业物联网平台需要同时连接10万台传感器设备,每个设备每秒发送一次数据。请设计一个高并发的Java Socket服务器,要求:
- 支持百万级并发连接。
- 降低CPU和内存占用。
- 保证低延迟。
解答
关键点分析
-
线程模型选择
- BIO(Blocking I/O):每个连接一个线程,线程开销大,不适用于高并发场景。
- NIO(Non-blocking I/O):通过
Selector
实现单线程或多线程处理多个连接,减少线程数量。 - AIO(Asynchronous I/O):Java的
AsynchronousSocketChannel
,基于异步回调,适合超大并发。
-
NIO实现原理
Selector
将多个SocketChannel
注册到一个事件轮询器上,通过select()
方法阻塞等待就绪事件(如读就绪)。- Epoll模型:Linux下NIO底层通过Epoll实现,效率高于传统的
select
/poll
。
-
连接池与线程池优化
- 使用线程池管理业务处理线程,避免频繁创建线程。
- 对于非阻塞IO,可采用“Reactor”模式:一个
Acceptor
线程处理新连接,多个Worker
线程通过Selector
处理IO事件。
-
零拷贝与内存优化
- 使用直接ByteBuffer(
ByteBuffer.allocateDirect()
)减少内存拷贝。 - 数据分片处理,避免大对象分配。
- 使用直接ByteBuffer(
示例代码(NIO Selector)
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;
public class HighConcurrencyServer {
public static void main(String[] args) throws Exception {
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
serverChannel.socket().bind(new InetSocketAddress(8080));
serverChannel.register(selector