2016-07-28 4 views
0

Ich bin aufgefordert, das folgende Programmierproblem zu entwerfen.Client Socket verbindet sich mit mehreren Sockeln und Lasten auf einen freien Sockel

Zuvor, als ein Client eine Anfrage an meine Anwendung gesendet hatte, musste ich diese an einen bestimmten Port auf einem anderen Server weiterleiten. Der Server würde zeitnah antworten und eine Antwort von ihrem Server an meinen Server senden und ich würde die Informationen an meinen Client senden. Dies funktionierte gut, bis die Last zunahm und wir bemerkten, dass der andere Server keine Multi-Thread-Aufrufe behandelte.

Ich habe eine begrenzte Anzahl von Ports von der anderen App erhalten, so dass immer, wenn eine Last von Clientanforderungen in meine Anwendung eintritt, ich die Last zwischen diesen Ports so ausgleichen muss, dass Port A nicht frei ist Client-Anforderung an Port B und wenn B nicht frei ist, geht es an Port C. [Ich weiß, dass dies keine richtige Lösung ist, das Management will, dass es so funktioniert]

Alle Anrufe behandelt sind synchron und alle Ports (Anforderung aus der Anwendung X) muss immer offen gehalten werden.

im Moment Meine größten Probleme sind:

  1. Zu wissen, wann ein Port frei ist. (nicht auf eine Antwort wartend)

  2. Wie man die Last zu den anderen Häfen schiebt.

Ich brauche ein paar Hinweise, wohin ich gehen soll. Könnten Sie bitte helfen?

Was ich bisher getan habe, ist das Laden mehrerer Sockets in ein Array von SocketAddress.

 Selector socketSelector = SelectorProvider.provider().openSelector(); 
     int interestSet = SelectionKey.OP_CONNECT | SelectionKey.OP_WRITE | SelectionKey.OP_READ; 
     List<SocketAddress> socketAddresses = FactorySockectConnection.getSocketInstances(); 

     for (SocketAddress socketAddress : socketAddresses) { 
      SocketChannel socket = SocketChannel.open(socketAddress); 
      socket.configureBlocking(false); 
      socket.register(socketSelector, interestSet); 
     } 
     System.out.println("Start"); 

     while (true) { 

      try { 
       socketSelector.select(); 

       Set<SelectionKey> keys = socketSelector.selectedKeys(); 
       Iterator<SelectionKey> keyIterator = keys.iterator(); 
       while (keyIterator.hasNext()) { 

        SelectionKey selectedKey = keyIterator.next(); 

        if (selectedKey.isConnectable()) { 
         SocketChannel connectChannel = (SocketChannel) selectedKey.channel(); 
         connectChannel.finishConnect(); 
        } 
        if (selectedKey.isWritable() && requestMessageByte != null) { 
         SocketChannel writeChannel = (SocketChannel) selectedKey.channel(); 
         ByteBuffer buf = ByteBuffer.wrap(requestMessageByte.getBytes()); 
         while (buf.hasRemaining()) { 
          writeChannel.write(buf); 
         } 
         requestMessageByte = null; 
        } 

        if (selectedKey.isReadable() && responseMessage == null) { 
         SocketChannel readChannel = (SocketChannel) selectedKey.channel(); 

         ByteBuffer readBuffer = ByteBuffer.allocate(1024); 
         readChannel.read(readBuffer); 
         responseMessage = new String(readBuffer.array()); 
        } 
        keyIterator.remove(); 
       } 

Antwort

0

Ich plane die Verwendung eines Load Balancer. Ich halte dich auf dem laufenden.

Verwandte Themen