【发布时间】:2017-09-12 21:15:51
【问题描述】:
我正在研究 Kafka 的网络层代码,有几个关于 Selector 的问题 类,特别是 poll() 方法是如何实现的。 poll() 方法是这样的:
void poll(int timeout){
....
/* check ready keys */
long startSelect = time.nanoseconds();
int readyKeys = select(timeout);
long endSelect = time.nanoseconds();
this.sensors.selectTime.record(endSelect - startSelect, time.milliseconds());
if (readyKeys > 0 || !immediatelyConnectedKeys.isEmpty()) {
pollSelectionKeys(this.nioSelector.selectedKeys(), false, endSelect);
pollSelectionKeys(immediatelyConnectedKeys, true, endSelect);
}
...
}
是否有特定要求,因此我们首先调用pollSelectionKeys() 方法
对于select() 方法返回的键,然后在立即连接的键上?是
只是为了清楚起见,我们分别执行这些操作,或者是否有一些特定的
涉及的要求?
其次,在pollSelectionKeys() 方法中,我们有:
void pollSelectionKeys(Iterable<SelectionKey> selectionKeys,
boolean isImmediatelyConnected,
long currentTimeNanos){
...
/* if channel is ready write to any sockets that have space in their buffer and for which
we have data */
if (channel.ready() && key.isWritable()) {
Send send = channel.write();
if (send != null) {
this.completedSends.add(send);
this.sensors.recordBytesSent(channel.id(), send.size());
}
}
...
}
据我了解,我们只会在 KafkaChannel 属于任何一个时写信给它
我们从之前调用select() 方法获得的keySet,或者如果KafkaChannel
与immediatelyConnectedKeys 之一相关联。我的问题是,我们为什么要这样做
以这种方式写信给KafkaChannels 的业务?更具体地说,我们不只是迭代
遍历所有已连接的KafkaChannels,如果他们有Send,请写信给他们
与他们关联的对象?这样,我们尽快写信给KafkaChannel,
无需等待它属于immediatelyConnectedKeys 或readyKeys。
【问题讨论】:
标签: java apache-kafka polling