Я работаю над задачей, связанной с чтением из торговых котировок сокета, и мне нужно добиться минимальной задержки и высокой пропускной способности.
Я начал с самого простого прототипа java nio, подобного этому
ByteBuffer buf = ByteBuffer.allocateDirect(BUFFER_SIZE);
try {
buf.clear();
int numBytesRead = socketChannel.read(buf);
if (numBytesRead == -1) {
socketChannel.close();
} else {
buf.flip();
byte[] byteArrived = new byte[buf.remaining];
buf.get(byteArrived,0,byteArrived.length);
// here we send byteArrived to the parser
}
} catch (IOException e) {
}
Я думаю, что создавать массив byte[] каждый раз неудобно, но из-за отсутствия знаний я не знаю, как анализировать ByteBuffer (потому что мне нужно разобрать байтовый протокол в сообщения и передать их в бизнес-логику). Можете ли вы порекомендовать, как избежать массового создания мусора?
Также я хотел бы спросить о лучших практиках, как организовать чтение сокетов с низкой задержкой и высокой пропускной способностью? Я читал о LMAX и инфраструктуре Disruptor, и они достигли 6 миллионов транзакций в одном потоке.