Я работаю над задачей, связанной с чтением из котировок сокетов, и мне нужно добиться минимальной задержки и высокой пропускной способности.
Я начал с самого простого прототипа 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 и инфраструктуре прерывателя, и они достигли 6 миллионов транзакций в одном потоке.