Errore 500 del server interno del proxy di funzione di Azure da SocketException

Aug 21 2020

Ho una funzione di Azure che usa proxy e inoltri a un'altra funzione di Azure come back-end. C'è un endpoint / api / ping che accetta un GET. Quando invio un HTTP-GET al ping, occasionalmente ricevo un errore interno del server 500 che ha avuto un errore in cui vedo solo la richiesta sul proxy ma non vedo la richiesta sulla funzione di esecuzione del codice back-end.

Ho aggiunto l'intestazione "Proxy-Trace-Enabled" per "true" all'intestazione per tracciare i risultati. Ho i risultati nella mia cartella D: \ home \ LogFiles \ Application \ Proxies \ DetailedTrace. Lì il registro per una richiesta non riuscita contiene un oggetto json "backend" con quanto segue

{
    "source": "forward-request",
    "timestamp": "2020-08-20T15:42:20.8272145Z",
    "elapsed": "00:00:00.0061051",
    "data": {
      "messages": [
        "Only one usage of each socket address (protocol/network address/port) is normally permitted Only one usage of each socket address (protocol/network address/port) is normally permitted",
        "Only one usage of each socket address (protocol/network address/port) is normally permitted",
        "Only one usage of each socket address (protocol/network address/port) is normally permitted"
      ]
    }
  }

Credo che questo sia Azure Functions 1.0 su DotNet, ma è stato creato molto tempo fa. Perché il mio semplice proxy di funzione di Azure mi dà errori interni del server che non vengono inoltrati al mio codice back-end per l'esecuzione?

Per riferimento su come tracciare le richieste

Risposte

JustinNeff Sep 09 2020 at 00:17

Esistono soglie di connessione TCP per i piani di servizio app per le funzioni di Azure che sono correlate alle connessioni socket. La documentazione era in un blog che collegherò qui. C'era una domanda simile su TCP / Port Exhaustion che utilizza una correlazione simile tra i problemi . Sebbene l'eccezione segnalata sia diversa, gli errori scompaiono durante i miei test quando si aumenta il servizio dell'app su cui si trova.

Esempio: ho 2 funzioni di Azure, FunctionA e FunctionB. FunctionA è un proxy e senza esecuzione back-end nel piano di servizio app P1. La funzioneB è una funzione non correlata ma viene eseguita sullo stesso piano di servizio app P1.

FunctionA sotto il piano di servizio app P1 si guasta con problemi di errore interno 500 del server quando viene chiamato. Segnalato come guasto in App Insights e tracciato nei log di back-end come eccezione del socket.

Ho ricreato la funzione di Azure, FunctionA, nel piano di servizio app P3. FunctionA non ha ricevuto 500 errori interni del server. Tuttavia non richiede la scala di un piano di pagamento P3. Quindi l'ho spostato di nuovo in P1. Si sono verificati di nuovo errori del server.

FunctionB era nello stesso piano di servizio app di FunctionA (P1). Le metriche di monitoraggio di Azure hanno sommato 4.200 SocketOutboundAll al minuto. Ho spostato (cancellato e ricreato) FunctionB da P1 a P3. Ho mantenuto la funzione A su P1. Gli errori di SocketOutboundAll sono stati eliminati da FunctionA su P1. Anche le funzioni nel piano di servizio app P3 non segnalano alcuna eccezione.