Java Server ayant de nombreux clients connectés sans goulot d’étranglement

Donc, ce que j’essaie de faire, c’est d’avoir un socket qui reçoit les entrées du client, de placer le client dans la queue, puis de renvoyer un message à chaque client dans la queue lorsque mon algorithme retourne vrai.

Cette queue devrait prendre en charge quelques centaines de clients à la fois, mais en même temps, ne pas mettre le serveur en attente pour qu’il puisse faire ce qu’il est censé faire.

C’est ce que j’ai jusqu’à présent:

private static final int PORT = 25566; private static final int THREADS = 4; private ExecutorService service; public void init() throws IOException, IllegalStateException { ServerSocket serverSocket; serverSocket = new ServerSocket(PORT); service = Executors.newCachedThreadPool(); Socket socket; while(true) { socket = serverSocket.accept(); System.out.println ("Connection established with " + socket.getInetAddress().toSsortingng()); service.execute(() -> { Scanner scanner = null; PrintWriter output = null; Ssortingng line = null; try { scanner = new Scanner(new InputStreamReader(socket.getInputStream())); output = new PrintWriter(socket.getOutputStream()); } catch(IOException e) { e.printStackTrace(); } try { if (scanner == null || output == null) throw new IllegalStateException("Scanner/PrintWriter is " + "null!"); line = scanner.nextLine(); while (line.compareTo("QUIT") != 0) { /* This is where input comes in, queue for the algorithm, algorithm happens then returns appropriate values */ output.flush(); line = scanner.nextLine(); } } finally { try { System.out.println ("Closing connection with " + socket.getInetAddress().toSsortingng()); if(scanner != null) { scanner.close(); } if(output != null) { output.close(); } socket.close(); } catch(IOException e) { e.printStackTrace(); } } }); } } 

Maintenant, ce que je pense va arriver avec ceci, si les files d’attente atteignent des niveaux suffisamment élevés, mon pool de threads gênera complètement le serveur car tous les threads sont utilisés pour gérer les clients dans la file d’attente et il n’y aura pas traitement suffisant pour l’algorithme.

EDIT: Après un tas de tests, je pense que cela fonctionnera si dans l’algorithme il retourne la valeur puis se déconnecte, n’attendant pas la réponse de l’utilisateur mais demandant au client de se reconnecter une fois que certaines conditions sont remplies.

Il est peu probable que votre goulot d’étranglement soit la puissance de traitement, sauf si vous êtes limité par la machine. Ce qui est plus susceptible de se produire, c’est que tous les threads de votre pool de threads sont consommés et finissent par attendre les entrées des clients. Votre conception ne peut traiter autant de clients à la fois qu’il ya de threads dans le pool.

Pour quelques centaines de clients, vous pouvez envisager de créer un thread pour chaque client. La ressource limitant le nombre de threads pouvant être pris en charge est généralement la mémoire de la stack requirejse par chaque thread, et non la puissance de traitement; pour une machine moderne avec une mémoire suffisante, un millier de threads ne constitue pas un problème, basé sur une expérience personnelle. Il peut exister un paramètre de système d’exploitation limitant le nombre de threads que vous devrez peut-être ajuster.

Si vous devez gérer un très grand nombre de clients, vous pouvez configurer votre code pour interroger les sockets sur les entrées disponibles et effectuer le traitement uniquement pour les sockets dont les entrées doivent être traitées.