Attualmente ho implementato un semplice server UDP usando i socket java, non appena il pacchetto viene ricevuto viene aggiunto alla coda e ci sono quattro thread di consumo che elaborano la coda.
Questo approccio va bene fino a 10000 req / sec, ma c'è una significativa perdita di pacchetti di pacchetti poiché il numero di pacchetti / sec è > 10000 req / sec.
Dopo un'attenta analisi i motivi sono le code, a causa della latenza di aggiungere il pacchetto alla coda e blocchi socket.receive
finché il pacchetto non viene aggiunto alla coda
Utilizzato anche il canale del datagramma che non è IO bloccante, ma i risultati sono più poveri dell'IO di blocco (java socket). Ecco il codice di esempio
try (DatagramSocket socket = new DatagramSocket(port)) {
System.out.println("Udp Server started at port :" + port);
while (true) {
byte[] buffer = new byte[1024];
DatagramPacket incomingDatagramPacket = new DatagramPacket(buffer, buffer.length);
try {
socket.receive(incomingDatagramPacket);
LinkedTransferQueue.add(incomingDatagramPacket);
} catch (IOException e) {
e.printStackTrace();
continue;
}
}
} catch (SocketException e) {
e.printStackTrace();
}
C'è un altro modo comprovato per progettare il server UDP in un modo migliore?