2017-12-20 1 views
3

Von meiner Azure-Funktion (die in Node.js ausgeführt wird, ausgelöst durch die EventHub-Nachricht) möchte ich eine Postanforderung an eine externe Seite senden. Etwas wie:Azure-Funktionen [JavaScript/Node.js] - HTTP-Aufruf, bewährte Methoden

module.exports = function (context, eventHubMessages) { 

var http = require("http"); 

context.log('JavaScript Function triggered by eventHub messages '); 

http.request(post_options, function(res){ 
    ... 
}) 

context.done(); 

Der obige Code wird wahrscheinlich funktionieren, aber ich habe Zweifel, ob das nicht ein Antipattern ist.

Situation vorstellen, wenn es Tausende von Funktionen in kurzer Zeit ausgelöst - für jede Ausführung benötigen wir ein HTTP-Client und erstellen Sie eine Verbindung zu schaffen ...

Von kurzem Forschungs mir einig Lösungsvorschlag gefunden habe für C# Azure-Funktionen: https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/ , die statische HttpClient-Klasse verwendet.

Ich habe eine Frage, gibt es einen ähnlichen Ansatz in Node.js Azure-Funktion? Oder eine andere Möglichkeit, um dieses Problem zu vermeiden, ein Objekt zwischen Node.js Azure Function Ausführungen zu teilen?

+2

Ich glaube nicht, dass Muster aus C# für Knotenfunktionen gelten. Der Knoten sollte Verbindungen für Sie verwalten. Ich würde "require" außerhalb der Funktion und "context.done" innerhalb des Callbacks verschieben. – Mikhail

+0

Können Sie das andere Ende anpassen, um Websockets zu akzeptieren? Weil das der beste Plan ist, macht alles andere mehr oder weniger eine schlechte Lösung, wenn Sie Hunderte von TCP-Handshakes pro Sekunde sprechen. – evilSnobu

Antwort

2

Wenn in kurzer Zeit ausgelöst Tausende von Funktionen, die Sie die Buchsen durch Modifizieren der http.globalAgent oder indem man eine Instanz eines neuen Agent

Ein Agent ist verantwortlich für die Verwaltung der Verbindung Persistenz und Wiederverwendung begrenzen sollten HTTP-Clients Es verwaltet eine Warteschlange ausstehender Anforderungen für einen gegebenen Host und Port , wobei für jede eine einzelne Socket-Verbindung wiederverwendet wird, bis die -Warteschlange leer ist. Zu diesem Zeitpunkt wird der Socket entweder zerstört oder in einen Pool gestellt, in dem er verwendet wird wieder für Anfragen an die gleichen Host und Port. Ob es zerstört oder gepoolt wird, hängt von der Option keepAlive ab.

Quelle: https://nodejs.org/api/http.html#http_class_http_agent

http.globalAgent.maxSockets Standardwerte bis ins Unendliche so, wenn Sie diesen Wert begrenzen Sie die Funktion aus Steckdosen läuft, und Sie werden Ihre Anfragen sehen auszufallen beginnen. Wenn Sie eine Verbindung zum selben Host herstellen möchten, sollten Sie keep-alive auf globalAgent/Agent aktivieren, um gepoolte Verbindungen zu ermöglichen.

Verwandte Themen