【发布时间】:2014-03-03 13:18:11
【问题描述】:
在 n 个线程之间分配传入连接是否有益,每个线程都有自己独立的 NIO Selector,其中 n 是服务器中的内核数?假设我正在编写一个服务器,它应该处理多个客户端连接。我可以有类似的东西:
selector.select();
Iterator<SelectionKey> i = selector.selectedKeys().iterator();
while (i.hasNext()) {
SelectionKey key = i.next();
i.remove();
if (!key.isValid())
continue;
if (key.isAcceptable()) {
// get one of the n selectors (I'd have one per core)
Selector chosenSelector = getRandomSelector();
// delegate the new connection to the chosen selector
SocketChannel newChannel = key.channel.accept();
newChannel.configureBlocking(false);
newChannel.register(chosenSelector, SelectionKey.OP_READ);
}
}
你们觉得这有道理吗?我的意思是,运行 n 个线程,每个线程都有不同的选择器?还是我应该坚持使用一个选择器线程来处理所有连接的 OP_READ?还是别的什么?
【问题讨论】:
-
保持不同客户端之间的消息顺序已经够难的了,无需刻意让它变得更难。你打算如何完成它?时间戳?
-
我猜排序消息是一个正交的问题......一旦我收到它们,有人(一个线程)检查时间戳并确保它们以正确的顺序处理,没有间隙。但我想我在这里问的是更基本的东西。
标签: java multithreading selector nio